javascript - 结合两个构造函数

标签 javascript object prototype

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

相关文章:

javascript - 获取 HTML 输入并构建查询字符串

javascript - 将单个单词对齐成行

javascript - 如何在 Javascript AutoDesk 中获取模型对象元数据属性

javascript - new到底在做什么?

javascript - 类与原型(prototype) Array.isArray

javascript - 在 Boolean 原型(prototype)中创建自定义函数,以 Integer 返回自身值

javascript - AngularJS 按键事件监听器 - 不是输入元素

javascript - 如何比较两个不同的javascript对象的相同属性(不比较实例函数)

java - 如何从对象中获取变量?

javascript - 如何从 JavaScript 对象呈现 HTML 中的嵌套列表?