Javascript 像HTMLParagraphElement这样的原型对象在BOM树中的位置?

Javascript 像HTMLParagraphElement这样的原型对象在BOM树中的位置?,javascript,Javascript,我想对BOM表结构有一个清晰的了解 问题1:例如,我有一个html文档,只有一个元素iside。当浏览器分析html文档时,它开始在BOM树中构建DOM树,我的段落元素被转换成p对象,该对象被放置在DOM树的指定位置-window.document.lastChild(我得到了html对象)。lastChile(我得到了html对象)。firstChild(我得到了p对象).问题是p对象原型链的所有对象都位于哪里-HTMLParagraphElement、HTMLElement、Element、

我想对BOM表结构有一个清晰的了解

问题1:例如,我有一个html文档,只有一个元素

iside
。当浏览器分析html文档时,它开始在BOM树中构建DOM树,我的段落元素被转换成
p
对象,该对象被放置在DOM树的指定位置-
window.document.lastChild(我得到了html对象)。lastChile(我得到了html对象)。firstChild(我得到了p对象).
问题是p对象原型链的所有对象都位于哪里-HTMLParagraphElement、HTMLElement、Element、Node?如果我使用HTMLParagraphElement对象(
document.getElementById(“1”)。\uuuuuu proto\uuuu;
)并询问“谁是你的父母?”(
(document.getElementById(“1”).proto.parentNode;)
)然后出现一些错误未捕获类型错误:非法调用

问题2:我认为所有原型对象(HTMLElement、元素、节点…)都位于窗口对象的根中(因为所有程序员的对象和原型对象都位于窗口对象的根中)。我查看了这个窗口根,发现有很多constructor函数(与原型对象具有相同的名称(函数HtmleElement()、函数元素()、函数节点()…)。这些函数中的每一个都同时具有\uuuuu proto\uuuu属性和构造函数属性。构造函数怎么可能有原型?构造函数只是在新对象中抛出属性(如.propname)。我认为只有“典型”对象(
var obj={name:1};
)能够包含原型属性。了解函数需要什么样的原型?

问题3:原来窗口对象有一些同名的原型对象,原型链还在继续。这些原型对象在窗口对象中的位置是什么?我认为窗口对象位于对象层次结构的顶部。我对javascrip了解得越多我越是明白我一无所知。请帮助我理解它。


首先,几乎没有对象具有
\uuuuu proto\uuuuuu
属性。不要信任将其显示为自有属性的开发人员工具。
\uuuuu proto\uuuuu
对象中定义的一个不太标准的访问器属性。prototype
提供对对象内部[[prototype]]插槽的访问

所有普通对象都有一个内部[[Prototype]]槽。它确定前一个对象从哪个对象继承

例如,
[]
创建一个数组,其[[Prototype]]为
array.Prototype
,其中定义了
push
forEach
等方法

所有构造函数都有一个
prototype
属性。实例化时,实例的[[prototype]]将指向此时构造函数的
prototype
的值

构造函数是函数对象,因此它们继承函数方法是有意义的。也就是说,它们的[[Prototype]]通常是
function.Prototype
或从中继承的对象

一些例子:

Object.getPrototypeOf([]); // Array.prototype
Object.getPrototypeOf(Array);    // Function.prototype
Object.getPrototypeOf(Function); // Function.prototype
Object.getPrototypeOf(Object);   // Function.prototype
Object.getPrototypeOf(Array.prototype);    // Object.prototype
Object.getPrototypeOf(Function.prototype); // Object.prototype
Object.getPrototypeOf(Object.prototype);   // null
出现“非法调用”异常的原因是
parentNode
Node.prototype
中定义,所有节点都从中继承(不一定直接继承)。
parentNode
被定义为一个getter,返回访问属性的节点的父节点

document.documentElement.parentNode; // document
document.documentElement.hasOwnProperty('parentNode'); // false
Node.prototype.hasOwnProperty('parentNode'); // true
然后,如果使用
Node.prototype.parentNode
,if将尝试检索
Node.prototype
的父节点,但是
Node.prototype
不是节点。因此,它会抛出。但是您可以使用

Reflect.get(Node.prototype, 'parentNode', document.documentElement); // document
最后,对象不需要存储在以全局对象为根的树中的某个位置。否则,它们不能被垃圾收集!对象只存储在内存中,并且它们可以被其他对象引用,也可以不被其他对象引用

(function() {
  var obj = {}; // This object is not referenced anywhere
})();

BOM-浏览器对象模型。这是窗口对象的模型。DOM位于BOM内部(window.document-DOM).请每个问题回答一个问题。此外,请使用段落、项目符号等来分隔文本。目前,没有空格和过度使用粗体的组合使得阅读非常困难。对于前两个问题,请阅读。它大致相当于“类”或“类型”,因此调用实例方法或访问实例上的实例属性毫无意义。对象属性可以指向整个对象,如
window.window.window