对用于检测功能存在的“ hasOwnProperty”感到困惑

时间:2019-08-09 09:18:15

标签: javascript

我确定这是重复的,但是我找不到正确的搜索词来找到答案。

我正在尝试使用hasOwnProperty()来确定对象上是否存在函数。我知道还有其他方法可以执行此操作,但是我想了解为什么该方法无法按我期望的方式工作。

我在Chrome Dev Tools控制台中输入了此内容:

window.hasOwnProperty("getSelection")
<- true

window.getSelection().hasOwnProperty("empty")
<- false

我不明白的是,当hasOwnProperty("empty")对象上存在该方法 并且我可以调用它时,为什么false返回Selection的原因。 / p>

window.getSelection().empty()  // Returns no errors

2 个答案:

答案 0 :(得分:5)

getSelection返回一个Selection对象实例,该实例的内部原型Selection.prototype。原型上具有empty方法;它不在实例本身上:

const sel = window.getSelection();
console.log(
  Object.getPrototypeOf(sel) === Selection.prototype,
  Selection.prototype.hasOwnProperty("empty")
);

如果您想自己实现这种事情:

class Foo {
  method() {
    console.log('method');
  }
}
const f = new Foo();
f.method();

console.log(
  f.hasOwnProperty('method'),
  Foo.prototype.hasOwnProperty('method')
);

答案 1 :(得分:1)

那是因为它不是该对象的属性,而是继承的。继承的属性不是对象的 own 属性,因为它们来自构造函数或类。更好的是in关键字:

console.log("getSelection" in window);
console.log("empty" in window.getSelection());