我只需要一些解释,没有任何代码样本。我知道什么是对象、构造函数和原型。我就是搞不懂HTMLElement
和HTMLDivElement
,或者HTMLMediaElement
和HTMLVideoElement
之间的关系。我知道有一些像prototype chain这样的东西,对象可以访问其构造函数的原型。但是HTMLDivElement
构造函数是Function(),而不是HTMLElement()
,另一方面,在HTMLVideoElement
中,我可以访问HTMLMediaElement
prototype的所有方法和属性。如果有人能帮我澄清一下,我将不胜感激。所以总而言之,function HTMLDivElement()
,->,function HTMLElement()
,->,function Element()
,->,function Node()
,->,function Object()
之间的关系是什么,是什么创造了链条。
发布于 2017-02-16 20:45:42
在Javascript中,用户创建的对象与平台(例如web浏览器)提供的对象之间存在差异。The former are known as "native objects" and the latter as "host objects".
对于constructor
和prototype
,原生对象可能具有有用的值。宿主对象通常不会,因为你不能以同样的方式构造它们。
实际的属性查找是使用内部原型属性完成的。这可以通过使用Object.getPrototypeOf
或__proto__
属性找到。您可以通过检查这些来查看原型链。请注意,__proto__
的可读性要强得多,并且很可能在现代web浏览器中工作,但Object.getPrototypeOf
是规范推荐的方法。
例如,假设vid
是对视频节点的引用:
vid.__proto__ // the HTMLVideoElement object
vid.__proto__.__proto__ // the HTMLMediaElement object
vid.__proto__.__proto__.__proto__ // the HTMLElement object
// or equivalents
Object.getPrototypeOf(vid) // the HTMLVideoElement
Object.getPrototypeOf(Object.getPrototypeOf(vid)) // the HTMLMediaElement object
Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(vid))) // the HTMLElement object
它一直延伸到
vid.__proto__.__proto__.__proto__.__proto__.__proto__.__proto__.__proto__ // === Object.prototype
// or
Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(Object.getPrototypeOf(vid)))))))
查看“真实”原型链的方法就是使用这种方法。
https://stackoverflow.com/questions/42283709
复制