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