javascript - document.body 与 Document.prototype.body

标签 javascript prototype

document.__proto__.__proto__===Document.prototype

返回 true 并且因为

Document.prototype.hasOwnProperty('body')

也返回真

有人能给我解释一下为什么 document.bodyDocument.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.prototypedocument.__proto__ 的类型(prototype..),但不代表是同一个对象。通过继承,在对象的原型(prototype)链中查找未作为对象属性找到的属性。对于 document.body,它来自 Document.prototype.body,所以让我们看一下该属性:

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

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

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

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

现在可以很清楚地看出区别是什么以及为什么会有不同的行为。

关于javascript - document.body 与 Document.prototype.body,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32841099/

相关文章:

javascript - 三个 js 正确地从场景中移除对象(仍然保留在 HEAP 中)

javascript - 使用纯 JS 动画更改 CSS 值

javascript - 哪个原型(prototype)用于创建带有未知标签的节点

javascript - 为什么这种行为?__proto__ vs 原型(prototype)?

javascript - 当模态在 vue 实例之外定义时,Bootstrap 模态不起作用

javascript - 写入时更改输入字段值

javascript - Electron - 创建文件时出现问题,错误 "EROFS: read-only file system"

javascript - 如何在 JavaScript 中使用链而不应用反模式?

javascript - 在构造函数变量上定义对象时 JavaScript 中会发生什么

javascript - 使用 setPrototypeOf 进行数组子类化