我正在尝试使用原型(prototype)来扩展一个构造函数:
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
有一个原型(prototype)属性 test
,它是 objB
的一个实例。这将共享给 objA
objA.prototype.test = new objB();
现在在 objA
的构造函数中,它修改 objA.prototype.test
,它在 objA
的所有实例之间共享。这意味着 objA
的所有实例都将具有值“D”,因为上一次迭代使共享属性保持“D”。
如果您想为每个实例保留一个唯一的 name
属性,you need to attach it to the instance ,而不是共享父级。
var objA = function (name) {
this.name = name;
}
现在,您似乎注意到实例和共享父级上都有 name
。好吧,JS首先从实例中读取。如果它看到一个属性 name
,它会从那里获取它的值。如果不是,它从共享父级读取,默认为“测试”。
It can be seen here ,我在其中做了一个小的 console.log
。您可以看到该值有 2 个名称属性,一个在实例上,一个在父级上,但它首先读取实例的值。
关于javascript - 结合两个构造函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16478236/