Javascript 关于在浏览器中扩展主机对象,标准(HTML5和EcmaScript 5.1)怎么说?

Javascript 关于在浏览器中扩展主机对象,标准(HTML5和EcmaScript 5.1)怎么说?,javascript,html,dom,ecmascript-5,Javascript,Html,Dom,Ecmascript 5,最近的标准对扩展宿主对象及其原型有何规定?例如,是否使用方法\u forEach扩展节点列表,或使用方法\u my\u query扩展文档 根据标准,我会在宿主对象上看到我添加到Object.prototype的任何内容吗 相对于相关标准,实际实现的行为如何 注意:我不是在问扩展主机对象或其原型是否是一个好主意(尽管Object.defineProperty在枚举问题时使事情变得更容易)。dom/html元素有一个原型链,如下所示: HTMLElement>Element>Node>Object

最近的标准对扩展宿主对象及其原型有何规定?例如,是否使用方法
\u forEach
扩展
节点列表
,或使用方法
\u my\u query
扩展
文档

根据标准,我会在宿主对象上看到我添加到
Object.prototype
的任何内容吗

相对于相关标准,实际实现的行为如何


注意:我不是在问扩展主机对象或其原型是否是一个好主意(尽管
Object.defineProperty
在枚举问题时使事情变得更容易)。

dom/html元素有一个原型链,如下所示:
HTMLElement>Element>Node>Object


在链子的任何一个地方钩住它,这可能是最好的选择。

ECMAScript 5规范规定:

web服务器为服务器端提供不同的主机环境 计算,包括表示请求、客户端和 文件夹;以及锁定和共享数据的机制。通过使用浏览器端 和服务器端脚本一起,可以分发 客户机和服务器之间的计算,同时提供定制的 基于Web的应用程序的用户界面

支持ECMAScript的每个Web浏览器和服务器都提供自己的主机环境, 完成ECMAScript执行环境


我不认为它还说了什么。这可以理解为,一个实现可以符合规范,并根据需要实现浏览器对象。过去就是这样。将语言的强大功能应用到外部环境似乎是合乎逻辑的,我相信现在所有的“现代”浏览器都能做到这一点。

ECMAScript 5没有提到主机对象的原型链

这在中定义

具体来说,请看一节,其中说:

除非另有规定,[[Prototype]]的内部属性 本节中定义的对象是对象原型对象

这来自:

每个ECMAScript全局环境([ECMA-262],第10.2.3节)必须 有自己独特的每个初始对象集,在 控件输入与 环境,但该环境的全局对象是 创建。给定全局空间中所有初始对象的[[Prototype]]s 环境必须来自同一个全球环境

甚至还有:

最后一节说(我的重点):

给定接口a的命名属性对象必须具有 内部[[Prototype]]属性,其值如下:

如果未声明从另一个接口继承,则 A的内部[[Prototype]]属性的 对象([ECMA-262],第15.4.4节),如果接口是用 [ArrayClass],或对象原型对象,否则 ([ECMA-262],第15.2.4节)

否则,将从另一个接口继承。价值 A的内部[[Prototype]]属性是接口原型对象 对于继承的接口

现在我们来看DOM级别3,我们可以看到它继承自节点接口。节点接口没有显式地继承其他任何内容,这意味着它继承自
对象.prototype

这是理论:)


实际上,并不是所有浏览器都遵循这种行为,尽管最近的大多数浏览器肯定都遵循这种行为。

应该在IE9+中工作。Object.prototype mods应该显示在主机对象上,但最好使用Node.prototype或Element.prototype或HTMLCollection.prototype等…这并没有解决规范实际说明的OP问题。这就留下了HTML5或DOM规范是否定义主机环境应如何行为的问题;特别是存在哪些宿主对象和原型。至少,您的引用打开了所有的可能性。感谢您再次指出,对于不同的ECMAScript执行上下文,原型是不同的。WebIDL是否意味着浏览器脚本环境必须公开
NodeList
HTMLElement
,或者只保证它们可以通过
Object.getPrototypeOf(document.createElement('div'))
等进行访问?据我所知,是的。其中说:“对于每个接口:……ECMAScript全局对象上必须存在相应的属性。属性的名称是接口的标识符,其值是一个称为接口对象的对象。”顺便说一句,您还可以在同一节中看到提到NamedConstructors。以及具有不同构造函数名称(即NamedConstructor)的接口示例--
[NamedConstructor=Audio,NamedConstructor=Audio(DOMString src)]接口HTMLAudioElement
iframe.appendChild instanceof Function;    // Evaluates to true