使用prototype覆盖对象属性

时间:2014-11-29 15:55:52

标签: javascript object

我试图覆盖构造函数b的.name属性。但它没有用。代码有什么问题。

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

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

alert(a.name)

1 个答案:

答案 0 :(得分:2)

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

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

var a = new b();

...即使a的原型有name="david"a 本身也有name="johnson"(在{b的调用中分配1}}),所以胜利。

读取对象属性的值基本上就是这样(假设__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];
}