function f() {
this.name = 'superman';
}
f.prototype.name = 'man';
alert(f.hasOwnProperty("name"));
var o = new f();
alert(o.hasOwnProperty('name'));
alert(o.constructor.prototype.hasOwnProperty('name'));
返回结果
false
true
true
第一个 alert
如果f 函数是以函数式调用 则 name 会定义到全局,f 不存在 name属性 因为 会返回false
第二个 alert
创建 o 对象时 name 的所有者是 o 对象,检查 o 对象是否存在 name 属性 肯定返回 true
第三个 alert
构造器的原型也有 name 属性 自然也会返回 true
代码稍微变更
function f() {
}
f.prototype.name = 'man';
var o = new f();
alert(o.hasOwnProperty('name'));
返回 false ,简单点说 hasOwnProperty() 他的调用者是谁它就在那个作用域中去寻找属性。
当前 name属性的所有者是 原型,调用者是 o 对象,所以他不会到原型中去找
这跟 直接弹出 alert(o.name) 不一样,如果是访问(读取)某一个属性 则首先会在构造器中找所接近的属性 如果没有 则会到原型中去找