最近的标准对扩展宿主对象及其原型有什么看法?例如,是NodeList
使用方法扩展_forEach
还是Document
使用_my_query
正确定义的方法进行扩展?
按照标准,我会看到我Object.prototype
在主机对象上添加的任何内容吗?
相对于相关标准,实际实现如何表现?
注意:我不是在问扩展宿主对象或其原型是否是一个好主意(尽管Object.defineProperty
在枚举问题时让事情变得更容易一些)。
最近的标准对扩展宿主对象及其原型有什么看法?例如,是NodeList
使用方法扩展_forEach
还是Document
使用_my_query
正确定义的方法进行扩展?
按照标准,我会看到我Object.prototype
在主机对象上添加的任何内容吗?
相对于相关标准,实际实现如何表现?
注意:我不是在问扩展宿主对象或其原型是否是一个好主意(尽管Object.defineProperty
在枚举问题时让事情变得更容易一些)。
ECMAScript 5 没有说明宿主对象的原型链。
这是在WebIDL中定义的。
具体来说,看看ECMAScript 绑定部分,它说:
除非另有说明,本节定义的对象的 [[Prototype]] 内部属性是 Object 原型对象。
这来自以下部分:
每个 ECMAScript 全局环境([ECMA-262],第 10.2.3 节)必须有自己独特的每个初始对象集,在控制进入与环境关联的任何 ECMAScript 执行上下文之前创建,但在该环境的全局对象之后创建被建造。给定全局环境中所有初始对象的 [[Prototype]] 必须来自同一个全局环境。
甚至还有一个例子:
iframe.appendChild instanceof Function; // Evaluates to true
最后,接口原型对象部分说(强调我的):
给定接口 A 的命名属性对象必须具有内部 [[Prototype]] 属性,其值如下:
如果 A 未声明为从另一个接口继承,则 A 的内部 [[Prototype]] 属性的值是 Array 原型对象([ECMA-262],第 15.4.4 节),如果该接口使用 [ArrayClass ],否则为 Object 原型对象 ([ECMA-262],第 15.2.4 节)。
否则,A 确实从另一个接口继承。A 的内部 [[Prototype]] 属性的值是继承接口的接口原型对象。
所以现在如果我们看一下 DOM Level 3 和Document 接口,我们可以看到它继承自 Node 接口。Node 接口没有显式继承自其他任何东西,这意味着它继承自Object.prototype
.
这是理论:)
在实践中,并非所有浏览器都遵循这种行为,尽管大多数最近的浏览器肯定会这样做。
ECMASCRIPT5 规范指出:
Web 服务器为服务器端计算提供不同的宿主环境,包括表示请求、客户端和文件的对象;以及锁定和共享数据的机制。通过同时使用浏览器端和服务器端脚本,可以在客户端和服务器之间分配计算,同时为基于 Web 的应用程序提供定制的用户界面。
每个支持 ECMAScript 的 Web 浏览器和服务器都提供了自己的宿主环境,从而完善了 ECMAScript 执行环境。
我不认为它说明了什么。这可以被解读为意味着一个实现可以符合规范并实现它想要的浏览器对象。过去就是这种情况。将语言的力量应用于外部环境似乎是合乎逻辑的,我相信所有“现代”浏览器现在都这样做。
dom/html 元素有一个原型链,如下所示:
HTMLElement > Element > Node > Object
在链中的任何地方钩住它产生 senes 的地方可能是最好的选择。