javascript学习笔记(五)原型和原型链详解(4)


<script type="text/javascript">
    function Box(){             //被继承的函数叫做超类型(父类,基类)
        this.name = "Jack";
    }

function Tree(){          //继承的函数叫做子类型(子类,派生类)
        this.age = 300;
    }
    //通过原型链继承,赋值给子类型的原型属性
    //new Box()会将box构造里的信息和原型里的信息都交给Tree
    Tree.prototype = new Box();//Tree继承了Box,通过原型,形成链条

var tree = new Tree();
    alert(tree.name);//弹出 Jack
</script>

原型链的问题:原型链虽然很强大,可以用它来实现继承,但它也存在一些问题。其中最主要的问题来自包含引用类型的值原型。包含引用类型的原型属性会被所有实例共享;而这也正是为什么要在构造函数中,而不是在原型对象中定义属性的原因。在通过原型来实现继承时,原型实际上回变成另一个类型的实例。于是,原先的实例属性也就变成了原型的属性。

在创建子类型的实例时,不能向超类型的构造函数中传递参数。实际上,应该说是没有办法在不影响所有对象实例的情况下,给超类型的构造函数传递参数。再加上刚刚讨论的由于原型中包含引用类型值所带来的问题,实践中很少会单独使用原型链。

再举个栗子:

复制代码 代码如下:


<script type="text/javascript">
    function Person(name)
    {
        this.name = name;//设置对象属性
    };

Person.prototype.company = "Microsoft";//设置原型的属性
    Person.prototype.SayHello = function() //原型的方法
    { 
        alert("Hello,I'm "+ this.name+ " of " + this.company);
    };

var BillGates = new Person("BillGates");//创建person对象
    BillGates.SayHello();//继承了原型的内容,输出"Hello,I'm BillGates of Microsoft"

var Jobs = new Person("Jobs");
    Jobs.company = "Apple";//设置自己的company属性,掩盖了原型的company属性
    Jobs.SayHello = function()
    {
        alert("Hi,"+this.name + " like " + this.company);
    };
    Jobs.SayHello();//自己覆盖的属性和方法,输出"Hi,Jobs like Apple"
    BillGates.SayHello();//Jobs的覆盖没有影响原型,BillGates还是照样输出
</script>

看下面一个原型链例子:

复制代码 代码如下:


<script type="text/javascript">
    function Year(){
        this.value = 21;
    }
    Year.prototype = {
        method:function(){

}
    };

function Hi(){

};
    //设置Hi的prototype属性为Year的实例对象
    Hi.prototype = new Year();
    Hi.prototype.year = 'Hello World';

Hi.prototype.constructor = Hi;

var test = new Hi();//创建一个Hi的新实例

//原型链
    test [Hi的实例]
        Hi.prototype [Year的实例]
            {year:'Hello World'}
            Year.prototype
                {method:……};
                object.prototype
                    {toString:...};

</script>

从上面例子中,test对象从Hi.prototype和Year.prototype中继承下来;因此他能访问Year的原型方法method,同时他能访问实例属性value

__ptoto__属性

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wgsjdf.html