0

在这里,我创建了一个父类的实例,并在对象本身上定义了一个名为微笑的属性。我知道在构造函数的原型上定义的属性不是对象自己的属性。但是为什么“微笑”属性没有通过循环内的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"
   }
}
4

2 回答 2

4

你在滥用Object.prototype.hasOwnProperty(). 所述函数将以被测对象作为其上下文来调用,这意味着你应该做p.hasOwnProperty(prop)而不是Object.hasOwnProperty(prop). 然后你会得到你期望的结果。

hasOwnProperty在 上定义Object.prototype,这意味着大多数对象(您手动将原型设置为的对象除外null)将继承该方法,因此可以在它们上调用它。p就是这样一个对象。它的原型链并没有什么异常,所以按照上面的描述改变它应该可以工作。

现在你可能会问为什么你的代码没有在 if 语句行抛出错误。那是因为Objectis 一个函数,因此最终继承自Object.prototype.

于 2016-03-17T15:35:16.723 回答
3
if (Object.hasOwnProperty(prop)) {

Checks if Object as an own property of the given name. Object.name exists on the Object function, which is why it returns true.

What you want is p.hasOwnProperty(prop) so that you're checking if the instance itself has the property rather than inheriting from the prototype. However, calling the function in this manner will cause issues if the instance has an own property named hasOwnProperty, so it's common to see the expanded form of:

Object.prototype.hasOwnProperty.call(p, prop)
于 2016-03-17T15:36:54.850 回答