标准(HTML5和EcmaScript 5.1)对在浏览器中扩展主机对象有什么规定?

What does the standard (HTML5 and EcmaScript 5.1) say about extending host objects in the browser?

本文关键字:对象 主机 扩展 什么 浏览器 HTML5 EcmaScript 标准      更新时间:2023-09-26

最近的标准对扩展宿主对象及其原型有什么规定?例如,扩展NodeList与方法_forEachDocument与方法_my_query正确定义?

我将看到任何我添加到Object.prototype主机对象的标准?

相对于相关标准,真实的实现是如何表现的?

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

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

WebIDL中定义。

具体来说,看一下ECMAScript绑定部分,它说:

的[[Prototype]]内部属性本节中定义的对象是Object原型对象。

和this,来自以下部分:

每个ECMAScript全局环境([ECMA-262],章节10.2.3)必须每个初始对象都有自己独特的集合,之前创建的控件的任何ECMAScript执行上下文环境,但是在该环境的全局对象之后创建。给定全局中所有初始对象的[[Prototype]]s环境必须来自同一个全局环境

甚至有这样一个例子:

iframe.appendChild instanceof Function;    // Evaluates to true

最后,接口原型对象部分说(强调我的):

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

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

否则,A继承另一个接口。的值A的internal [[Prototype]]属性是接口原型对象

所以现在如果我们看一下DOM Level 3和Document接口,我们可以看到它继承自Node接口。Node接口不显式地继承其他任何东西,这意味着它继承自Object.prototype

这是理论:)

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

ECMASCRIPT5规范规定:

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

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

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

dom/html元素的原型链如下:HTMLElement > Element > Node > Object
在链中任何有意义的地方进行挂钩可能是最好的选择。