美文网首页
js 原型链的问题

js 原型链的问题

作者: 施主画个猿 | 来源:发表于2018-03-30 14:54 被阅读0次

    原型链的问题

    包含引用类型值的原型属性会被所有实例共享;(而这也正是为什么要在构造函数中,而不是在原型对象中定义属性的原因)在通过原型来实现继承时,原型实际上会变成另一个类型的实例。于是,原先的实例属性也就顺理成章地变成了现在的原型属性了。下列代码可以用来说明这个问题。

    function SuperType(){   
      this.colors = ["red", "blue", "green"];
    }
    function SubType(){}//继承了SuperType
    SubType.prototype = new SuperType();
    var instance1 =newSubType();
    instance1.colors.push("black");
    //"red,blue,green,black"
    alert(instance1.colors);
    var instance2 = new SubType();
    //"red,blue,green,black"
    alert(instance2.colors);
    

    SuperType构造函数定义了一个colors属性,该属性包含一个数组(引用类型值)。SuperType的每个实例都会有各自包含自己数组的colors属性。当SubType通过原型链继承了SuperType之后,SubType.prototype就变成了SuperType的一个实例,因此它也拥有了一个它自己的colors属性——就跟专门创建了一个SubType.prototype.colors属性一样。但结果是什么呢?结果是SubType的所有实例都会共享这一个colors属性。而我们对instance1.colors的修改能够通过instance2.colors反映出来,就已经充分证实了这一点。

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

    相关文章

      网友评论

          本文标题:js 原型链的问题

          本文链接:https://www.haomeiwen.com/subject/paricftx.html