javascript – document.body vs Document.prototype.body

以来

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>

最佳答案 Document.prototype是document .__ proto__的类型(prototype ..),但它并不意味着它是同一个对象.通过继承,在其原型链中查找未找到作为对象属性的属性.在document.body的情况下,它来自Document.prototype.body,所以让我们看一下该属性:

console.log(Object.getOwnPropertyDescriptor(Document.prototype, 'body'))

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

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

console.log(Object.getOwnPropertyDescriptor(Document.prototype, 'body').get.call(document))

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

点赞