我正在尝试使用原型将一个构造函数扩展为另一个构造函数:

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个名称属性,一个在实例上,一个在父级上,但是它首先读取该实例的值。

10-07 18:05