我正在试验Google闭包库,特别是它的“继承”方法。
我有一个问题。当我扩展基类时,如果我没有在其构造函数中设置基类的属性,则所有子项最终都会共享属性,例如,如果我将项添加到数组,则数组会不断变大。
有人可以解释为什么我需要在构造函数中设置属性吗?
这是我的例子,如果你注释掉“this.list = [9,8,7];”在“人物”构造函数中,子项共享人员列表并继续添加。
http://jsbin.com/imujoy/1/edit
感谢您的帮助。
答案 0 :(得分:0)
当你从孩子那里引用“this.list”时,它首先会查看对象本身以找到该属性。当它找不到它时,它会查看它的原型并找到“list”数组。但是,该列表是对您在Person原型上创建的相同列表的引用。如果在构造函数中分配新的“this.list”,则只是在对象而不是原型上分配属性。一般来说,如果您打算使用继承模型,则不应在原型上分配非基本类型(数组,对象),因为子项将共享相同的引用。
答案 1 :(得分:0)
您是使用Parent.call(this)还是Parent.apply
复制子项中的父定义变量function Child(){
Parent.apply(this,arguments);
}
goog.inherits(Child, Parent);
list在以下方式在Parent中定义时成为任何Child实例的属性:
function Parent(){
this.list=[];
}
基本原型行为:
Prototypical inheritance - writing up 处理构造函数参数的好参考但是要应用你必须实现_init并更改goog.base: How to "properly" create a custom object in JavaScript?