这里我创建了一个父类的实例,并在对象本身上定义了一个名为smile的属性。我知道构造函数原型上定义的属性不是对象自己的属性。但是,“smile”属性怎么没有在for循环中传递hasOwnProperty测试?
function Parent(){
this.name='parent';
}
Parent.prototype.age='34';
var p=new Parent();
p.smile='nice'; // not an own property ?
console.log(p);
for(var prop in p){
if(Object.hasOwnProperty(prop)){
console.log(prop); // prints only "name"
}
}
答案 0 :(得分:4)
你在滥用Object.prototype.hasOwnProperty()
。使用测试对象作为其上下文调用所述函数,这意味着您应该p.hasOwnProperty(prop)
而不是Object.hasOwnProperty(prop)
。然后你会得到你期望的结果。
hasOwnProperty
在Object.prototype
上定义,这意味着大多数对象(除了您手动将原型设置为null
的对象)将继承该方法,因此它可以被调用他们。 p
就是这样一个对象。它的原型链没有什么不寻常之处,所以根据上面的描述改变它应该有效。
现在您可能会问为什么您的代码不会在if语句行上引发错误。这是因为Object
是一个函数,因此最终继承自Object.prototype
。
答案 1 :(得分:3)
if (Object.hasOwnProperty(prop)) {
检查Object
是否为给定名称的自有属性。 Object.name
函数中存在Object
,这就是它返回true
的原因。
您想要的是p.hasOwnProperty(prop)
,以便您检查实例本身是否具有属性而不是继承原型。但是,如果实例具有名为hasOwnProperty
的自己的属性,则以这种方式调用该函数将导致问题,因此通常会看到扩展形式:
Object.prototype.hasOwnProperty.call(p, prop)