我试图覆盖构造函数b的.name
属性。但它没有用。代码有什么问题。
function b(){
this.name="johnson"
}
b.prototype.name="david"
var a= new b()
alert(a.name)
答案 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];
}