我正在尝试使用原型将一个构造函数扩展为另一个构造函数:
var objA = function(name){
var obj = this;
this.test.name = name;
window.setTimeout(function(){
console.log(obj.test.name)
}, 1)
}
var objB = function(name){
this.name = 'test'
}
objA.prototype.test = new objB();
var a = ['A', 'B', 'C', 'D']
for(var i = 0; i < a.length; i++){
new objA(a[i])
}
这种方法对一个对象非常有效,但是(如本例所示)如果我想创建多个对象,则似乎最后一个条目('D')会覆盖先前的条目,因为在所有4种情况下
obj.test.name
返回D
。也许有人可以指出我做错了什么,或者针对这种情况的其他解决方案。谢谢。 最佳答案
JavaScript通过链接对象实现继承。 objA
具有原型属性test
,它是objB
的实例。这与所有objA
实例共享
objA.prototype.test = new objB();
现在,在您的
objA
构造函数中,它将修改objA.prototype.test
,该共享在objA
的所有实例之间共享。这意味着objA
的所有实例的值都将为“ D”,因为上一次迭代使共享属性保持为“ D”。如果要为每个实例you need to attach it to the instance(而不是共享父对象)保留唯一的
name
属性。var objA = function (name) {
this.name = name;
}
现在,您似乎注意到实例和共享父实例上都有
name
。好吧,JS首先从实例读取。如果看到属性name
,则从那里获取其值。如果不是,它将从共享的父级读取,默认为“ test”。It can be seen here,我在其中做了一个小调
console.log
。您可以看到该值具有2个名称属性,一个在实例上,一个在父级上,但是它首先读取该实例的值。