gpt4 book ai didi

javascript - 结合两个构造函数

转载 作者:行者123 更新时间:2023-11-30 10:31:50 24 4
gpt4 key购买 nike

我正在尝试使用原型(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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com