为何hasOwnProperty检测Selection对象empty方法返回false?
为什么
hasOwnProperty("empty")返回false但方法能正常调用? 这个问题的核心是理解JavaScript的原型链机制和hasOwnProperty()的工作逻辑,我给你一步步拆解清楚:
1. hasOwnProperty()的本质:只检查对象自身属性
hasOwnProperty()方法的作用很明确:它仅判断某个属性/方法是否直接属于当前对象实例本身,完全不会去遍历它的原型链查找继承来的属性。
你看到window.hasOwnProperty("getSelection")返回true,是因为getSelection确实是直接挂载在window对象自身上的属性,不是从原型继承的,所以能被检测到。
2. empty方法存在于原型而非实例自身
window.getSelection()返回的是一个Selection对象实例,而empty方法并不是直接定义在这个实例上的——它是定义在Selection的原型对象(Selection.prototype)上的。
所以当你调用window.getSelection().hasOwnProperty("empty")时,因为实例自身没有这个方法,自然返回false。你可以在控制台验证这一点:
// 检查原型上是否存在empty方法 Selection.prototype.hasOwnProperty("empty") // 返回true
3. 为什么方法能正常调用?
JavaScript在查找属性或方法时,会遵循原型链查找规则:如果当前实例没有找到目标属性,就会向上遍历它的原型对象、原型的原型……直到找到对应的属性,或者遍历到null为止。
所以虽然Selection实例自身没有empty方法,但它的原型上有,因此你调用window.getSelection().empty()时能正常执行,不会报错。
额外验证:用in运算符检测继承属性
如果你想检测某个属性是否存在(包括原型链上的),可以用in运算符:
"empty" in window.getSelection() // 返回true
内容的提问来源于stack exchange,提问作者ᴇʟᴇᴠᴀтᴇ
相关产品推荐
相关产品推荐

