我想对BOM的结构有一个清晰的理解。
问题1:例如,我有一个html文档,只有一个元素<p id="1"> </p>
iside <body></body>
。当浏览器对html文档进行分析时,它开始在BOM树中构建DOM树,并且我的段落元素被转换成一个p
对象,该对象被放置在DOM树的确定位置--window.document.lastChild(I have got the html object).lastChile(I have got the html object).firstChild(I have got the p object).
,问题是p对象原型链的所有对象位于哪里-- HTMLParagraphElement、HTMLElement、Element、Node? -如果我使用HTMLParagraphElement对象(document.getElementById("1").__proto__;
)并问“您的父对象是谁?”((document.getElementById("1").__proto__.parentNode;)
),那么出现了一些错误:Uncaught :非法调用。
问题2:我有一个想法,所有原型对象(HTMLElement,Element,Node.)放置在窗口对象的根中(因为所有程序员的对象和原型对象都在放置窗口对象的根)。我查看了这个窗口根目录,发现有很多consctructor函数(它们的名称与原型对象(函数HTMLElement()、函数元素()、函数Node().)相同)。这些函数中的每一个都同时具有__proto__属性和构造函数属性。构造函数怎么可能有原型呢?构造函数只是在新对象中抛出属性(如this.propname)。我认为只有“典型”对象(var obj={name:1};
)才能包含原型属性。函数所需的这个原型的?
问题3:原来窗口对象有一些同名的原型对象,并且原型链还在继续。,这些原型对象放置在窗口对象中的哪里?,我认为窗口对象位于对象层次结构的顶部。正如我所看到的,我对javascript的了解越多,我就越明白我什么都不知道。帮帮我,求你了,去理解它。
发布于 2016-07-01 19:44:50
首先,几乎没有一个对象具有__proto__
属性。不要将显示为自己属性的开发工具生锈。__proto__
是在Object.prototype
中定义的一个标准不大的访问器属性,它提供对对象的内部[原型]槽的访问。
所有普通物体都有一个内部[原型]槽。它决定前者是从哪个对象继承的。
例如,[]
创建一个[Prototype]为Array.prototype
的数组,其中定义了push
和forEach
等方法。
所有构造函数都有一个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
})();
https://stackoverflow.com/questions/38152158
复制相似问题