我的理解是,Object.hasOwnProperty
方法检查对象是否具有它自己的属性名称,即非继承属性。这意味着只要属性 a. 不存在或 b. 是继承的,该函数就应该返回 false。
如果我错了请纠正我,但是除非这不使用经典继承,否则下面代码中的 bar
不是从 Foo
继承的吗?当 propname
属性是继承属性时,为什么 hasOwnProperty
方法返回 true?我在这里做错了什么?
此外,我将如何在 Foo
对象上使用 hasOwnProperty
?当检查 Foo
对象时,此处的代码返回 false
。
function Foo() {
this.propname = 'test';
}
var bar = new Foo();
console.log(bar.hasOwnProperty('propname')); // returns true
console.log(Foo.hasOwnProperty('propname')); // returns false
最佳答案
这里的绊脚石是 Javascript 使用原型(prototype)继承。您所看到的实际上根本不是继承。
hasOwnProperty
将返回 false
如果属性:
- 不存在。
- 存在但仅在原型(prototype)链上。
代码中的“类”与继承完全无关,它只是一个在对象上设置某些属性的函数。
该对象恰好是一个新的空对象的实例,因为您使用 new
关键字调用该函数,这可能是混淆的来源。
想象一下重写这个函数:
function foo() {
var bar = {};
bar.propname = 'test';
return bar;
}
var baz = foo();
您希望 baz.hasOwnProperty('propname')
返回 true 吗?绝对可以,因为我们明确定义了对象的属性。
另一种声明属性的方法是在 Foo
的原型(prototype)上声明它。
function Foo() {
this.bar = 'baz';
}
Foo.prototype.propname = 'test';
var baz = new Foo();
baz.propname; // 'test'
baz.hasOwnProperty('propname'); // false
同样,这里发生的神奇事情全都归功于 new
关键字。当您使用 new
调用函数时,该函数会将 this
的值赋给一个新对象,并将该对象的原型(prototype)设置为与函数原型(prototype)相同你在打电话。
也许最简单的解释方法是 bar
上有一个 hasOwnProperty
方法,但是如果你调用 bar.hasOwnProperty('hasOwnProperty')
它将返回 false
。
这是因为 hasOwnProperty
方法位于原型(prototype)链的最顶端,在 Object.prototype
上。 Javascript 中的每个对象都从这里继承,这就是为什么每个对象都会有一个 hasOwnProperty
方法。
有一个 good article关于为什么 new
使 Javascript 中的面向对象编程变得困难。
关于JavaScript:为什么 Object.hasOwnProperty 方法的行为是这样的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29587721/