我确定这是重复的,但是我找不到正确的搜索词来找到答案。
我正在尝试使用hasOwnProperty()
来确定对象上是否存在函数。我知道还有其他方法可以执行此操作,但是我想了解为什么该方法无法按我期望的方式工作。
我在Chrome Dev Tools控制台中输入了此内容:
window.hasOwnProperty("getSelection")
<- true
window.getSelection().hasOwnProperty("empty")
<- false
我不明白的是,当hasOwnProperty("empty")
对象上存在该方法 并且我可以调用它时,为什么false
返回Selection
的原因。 / p>
window.getSelection().empty() // Returns no errors
答案 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());