【问题标题】:What is an ECMAScript "native object"?什么是 ECMAScript “本机对象”?
【发布时间】:2011-11-08 15:09:47
【问题描述】:

根据ECMA-262一个原生对象

ECMAScript 实现中的对象,其语义完全 由本规范而非宿主环境定义

一个内置对象被定义为

由 ECMAScript 实现提供的对象,独立于 主机环境,即在执行开始时存在 ECMAScript 程序。

附注

标准的内置对象在本规范中定义, ECMAScript 实现可以指定和定义其他的每个 内置对象是原生对象。

如果原生对象完全由 ECMA-262 规范而不是宿主环境定义,并且 ECMAScript 实现可以指定和定义新的内置对象,那么这些新的内置对象如何可以是原生对象?它们没有完全由 ECMA-262 规范定义?

我错过了什么?

【问题讨论】:

    标签: javascript ecmascript-5


    【解决方案1】:

    它们是“原生的”,因为它们带有 ECMAScript 实现。应用程序中的宿主环境,通常由 ECMAScript 实现和其他几个协同工作的接口组成。例如,

    • Web 浏览器 — 由 ECMAScript 实现、DOM 接口、渲染引擎、UI 等组成的宿主环境。
    • Windows Script Host — 由 ECMAScript 实现、VBScript 实现等组成的宿主环境。
    • Node.js — 由 ECMAScript 实现 (V8)、HTTP 接口等组成的宿主环境。

    “内置”对象需要ObjectFunction继承,而宿主对象——宿主环境提供的对象,但不一定在执行开始时出现——不需要但可能(有时会)。

    ECMA-262 定义的原生对象示例

    • Object(), Array(), Date()
    • MathJSON,全局对象。

    ECMA-262 定义的原生内置对象示例

    宿主对象示例

    • DOM 对象,documentwindow
    • console

    【讨论】:

    • 你确定没有Object.getPrototypeOf(obj)不包含Object.prototype的内置对象吗?
    • 请注意,WeakMap 不是专有扩展,它是 Harmony 提案的实现。 ActiveXObject() 也是一个宿主对象,而不是本机对象。
    • @gsnedders: ActiveXObject() 一个原生对象,但它返回一个宿主对象。即使在旧版本的 IE 和 JScript 中,ActiveXObject.prototype 也存在,而它不在 所有其他 宿主对象上。此外,WeakMap() 是 Harmony 成为 ES 6 之前的扩展:-p
    • @Raynos @AndyE Object.getPrototypeOf(Object.prototype) === nullObject 原型对象是唯一一个在其原型链中没有 Object 原型对象的内置对象。
    • @Raynos 它不是专有的,因为它被充分指定为任何人都可以实现。它不是标准的,没错,但它不是专有的。
    【解决方案2】:

    原生对象的语义完全由 ECMA-262 定义。对象本身可能不是。

    所以我们有三个层次的对象:

    1. 标准内置对象:定义了 ECMA-262,并遵循 ECMA-262 语义。示例:Object
    2. 其他内置对象:未在 ECMA-262 中定义,但遵循 ECMA-262 语义。示例:setTimeout
    3. 主机对象:不遵循 ECMA-262 语义;它们可以有任何类型的奇怪行为,并以奇怪和意想不到的方式与 EMCA-262 内置对象交互(例如谎报各种内部属性)。示例:NodeList

    【讨论】:

    • setTimeout 不是内置对象,它是宿主对象(它是 DOM 的一部分)。
    • 我自己并不完全清楚,但我很确定它遵循 ECMA-262 语义,这将使它成为这些定义的内置,对吧?
    • 主机对象可以根据需要遵循 ECMA-262 语义。遗憾的是,在旧版本的 IE 和其他浏览器中,情况并非如此。在 IE 7 及更低版本中,即使 setTimeout instanceof Function 返回 falsetypeof setTimeout 返回 "object"
    【解决方案3】:

    native object的定义是host object的相对术语
    就像window.console 对象是一个主机对象,没有记录 Ecma262 来告诉浏览器如何实现它。
    而 Ecma262 只是一个指定语言功能的项目。 ECMAScript 实现实际上是浏览器的业务。这意味着实现符合object type 上的规范,我们可以说是built-in object,尽管它们的工作方式并不完全相同。

    【讨论】:

      猜你喜欢
      • 2011-05-15
      • 2018-02-02
      • 2016-03-12
      • 2011-10-10
      • 1970-01-01
      • 1970-01-01
      • 2011-11-28
      • 2014-03-02
      相关资源
      最近更新 更多