JavaScript:为什么 Object.hasOwnProperty 方法的行为是这样的?

标签 javascript inheritance hasownproperty

我的理解是,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 如果属性:

  1. 不存在。
  2. 存在但仅在原型(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/

相关文章:

javascript - 在浏览器中调整图像大小

javascript - react .js : Show '...' after value in input element onBlur if value overflows input element

使用继承的c++语法

swift - 协议(protocol)子类实现

javascript - 即使属性存在,Node.js hasOwnProperty 也不起作用

javascript - VueJS/Vuetify - 可拖动的响应式卡片网格 - 不起作用

javascript - 添加动画 gif 以响应网络应用程序

c# - 关于 .NET 框架中继承的一般问题

javascript - 是否有一种 jQuery 方法可以仅迭代对象自己的属性?

javascript - if (obj.nonExistent Property) 是否触发任何浏览器错误?