document.body vs Document.prototype.body

时间:2015-09-29 10:00:05

标签: javascript prototype

document.__proto__.__proto__===Document.prototype

返回true,因为

Document.prototype.hasOwnProperty('body')

也会返回true

有人可以向我解释为什么 document.body Document.prototype.body 不是一回事吗?此外,为什么Chrome开发者工具中的 Document.prototype.body 会导致

Uncaught TypeError: Illegal invocation(…)
(anonymous function) @ VM6098:2
InjectedScript._evaluateOn @ VM3911:904
InjectedScript._evaluateAndWrap @ VM3911:837
InjectedScript.evaluate @ VM3911:693

document.body 会导致

<body...>...</body>

1 个答案:

答案 0 :(得分:2)

Document.prototypedocument.__proto__的类型(原型..),但它并不意味着它是同一个对象。通过继承,在其原型链中查找未找到作为对象属性的属性。如果document.body来自Document.prototype.body,那么请查看该属性:

&#13;
&#13;
console.log(Object.getOwnPropertyDescriptor(Document.prototype, 'body'))
&#13;
&#13;
&#13;

可以看出,body属性定义了 getter 方法,并且它不是一个简单的原始值。这已经让我们暗示为什么Document.prototype.body可能会失败 - 它需要一些实例来操作。

事实上,我们可以使用我们选择的this来调用此方法,我们的document实例:

&#13;
&#13;
console.log(Object.getOwnPropertyDescriptor(Document.prototype, 'body').get.call(document))
&#13;
&#13;
&#13;

现在很清楚看到差异是什么以及为什么它的表现不同。