【问题标题】:Override object property using prototype使用原型覆盖对象属性
【发布时间】:2014-11-29 15:55:51
【问题描述】:

我正在尝试覆盖构造函数 b 的 .name 属性。但它不起作用。代码有什么问题。

function b(){
    this.name="johnson"
}

b.prototype.name="david"
var a= new b()

alert(a.name)

【问题讨论】:

  • 为什么要投反对票。我发错了什么吗
  • 嗯,说“它不起作用”而不说你期望什么或你得到什么有点问题。

标签: javascript object


【解决方案1】:

如果您在alert 中看到"johnson",那么它工作正常。

当您直接向对象添加属性时,它优先于其原型上具有相同名称的任何属性。所以在

var a = new b();

...即使a 的原型有name="david"a 自身name="johnson"(在对b 的调用中分配),这样就赢了。

读取对象属性的值基本上是这样工作的(假设 __proto__ 是一个对象的魔法属性,它引用它的原型 [它将是,在 ES6 中]):

function getPropertyValue(obj, propertyName) {

    // Start with the object itself
    var o = obj;

    // Loop until we find an object in the prototype chain that has a property called "name"
    while (!o.hasOwnProperty(propertyName)) {
        // This one doesn't, look to its prototype
        o = o.__proto__;

        // Did it have one?
        if (!o) {
            // No, property not found
            return undefined;
        }
    }
    return o[propertyName];
}

【讨论】: