本地对象和主机对象有什么区别?
后者是否简单地引用由自定义构造函数创build的非原始函数对象(例如,var bird1 = new Bird();)?
这两个术语在ECMAScript规范中定义:
本地对象
对象在ECMAScript实现中,其语义完全由该规范定义而不是由主机环境定义。
注:标准本地对象在本规范中定义。 一些本地对象是内置的; 其他的可能会在执行ECMAScript程序的过程中构build。
资料来源: http : //es5.github.com/#x4.3.6
主机对象
对象提供的主机环境来完成ECMAScript的执行环境。
注意任何非本地对象都是一个主机对象。
资料来源: http : //es5.github.com/#x4.3.8
几个例子:
本地对象: Object
(构造函数), Date
, Math
, parseInt
, eval
,string方法如indexOf
和replace
,数组方法,…
主机对象(假设浏览器环境): window
, document
, location
, history
, XMLHttpRequest
, setTimeout
, getElementsByTagName
, querySelectorAll
,…
这是我对规格的理解。
这个:
var bird = new Bird();
…产生一个本地对象,它只是碰巧使用new
运算符创build的。
本机对象具有以下内容之一的内部[[Class]]属性:
“Arguments”“Array”“Boolean”“Date”“Error”“Function”“JSON”“Math”“Math”“Number”“Object”“RegExp”“String”
对于你的bird1
将是:
“目的”
就像你创build一个函数一样:
function my_func() { // ... }
… my_func
没有在ECMAScript中定义,但它仍然是一个内部[[Class]]的本地对象:
“function”
主机对象是环境提供的对象,以便为规范中没有定义的环境提供特定的用途。
例如:
var divs = document.getElementsByTagName('div')
divs
引用的对象是一个NodeList ,它以一种像常规的JavaScript对象一样的方式集成到环境中,但是它并没有被规范定义在任何地方。
其内部的[[Class]]属性是:
“节点列表”
这为实现devise人员提供了一些适应环境特定需求的灵活性。
在整个规范中定义了主机对象的要求。
如果我们区分三种对象,则更加清楚:
内置对象 : String
, Math
, RegExp
, Object
, Function
等 – 核心预定义的对象始终可用JavaScript。 在ECMAScript规范中定义。
主机对象 :由浏览器环境提供的对象,如window
, XmlHttpRequest
,DOM节点等。 它们与内置对象不同,因为不是所有环境都具有相同的主机对象。 如果JavaScript在浏览器之外运行,例如像Node.js中的服务器端脚本语言,则不同的主机对象将可用。
用户对象 :在JavaScript代码中定义的对象。 所以你的例子中的“鸟”将是一个用户对象。
JavaScript规范将内置对象和用户对象组合为本地对象 。 这是对“本地”一词的非正统使用,因为用户对象显然是用JavaScript实现的,而内置的插件最有可能在不同的语言下实现,就像宿主对象一样。 但是从JavaScript规范的angular度来看,内build的和用户对象都是JavaScript本地的,因为它们是在JavaScript规范中定义的,而主对象则不是。
无法看到令人信服的答案是否var bird1 = new Bird();
是本机或主机对象。 假设Bird是一个用户定义的函数,根据http://es5.github.io/#x13.2通过javascript实现创build一个本地;非内置对象。 相比之下,自从javascript程序(比如Object和许多其他)开始,本地内置对象就会出现。 本地对象和主机对象的区别在于,前者是由javascript实现创build的,而后者是由主机环境提供的。 因此,宿主对象的内部[[class]]属性可以与内置对象(即“参数”,“Array”,“Boolean”,“Date”,“Error”,“Function”,“ JSON“,”Math“,”Number“,”Object“,”RegExp“和”String“)。
另外,值得注意的是,ECMA6 http://www.ecma-international.org/publications/files/ECMA-ST/Ecma-262.pdf不再使用术语本机和主机对象。; 相反,它定义了下面的对象types,更清楚地解释了它们的预期行为。
4.3.6普通对象
对象具有必须由所有对象支持的基本内部方法的默认行为
4.3.7奇特的对象
对象不具有所有对象必须支持的一个或多个基本内部方法的默认行为注意任何不是普通对象的对象都是exception对象。
4.3.8标准对象
对象的语义是由这个规范定义的
4.3.9内置对象
由ECMAScript实现指定和提供的对象
本地对象是符合规范的对象,即“标准对象”。
主机对象是浏览器(或其他运行时环境,如Node)提供的对象。
大多数主机对象都是本地对象,每当使用new
实例化某个对象时,可以99.99%确定它是本地对象,除非您弄乱了奇怪的主机对象。
由于IE (以及其他旧浏览器)中存在非常奇怪的对象,因此引入了这个概念。 例如:
typeof document.all == "undefined"; // true document.all.myElementId; // object
当看到这个时,每个人都会同意document.all
显然是“非标准的”,因此是非本地主机对象。
那么为什么不首先调用本地对象标准对象呢? 简单:毕竟, 标准(!)文件也谈论非本地对象,并称它们为非标准将导致矛盾。
再次:
- native ==“标准”
- 主机==由浏览器或节点提供或…
- 大多数主机对象都是本地的,所有非主机对象也是本地的
这可能是矫枉过正的,但是为了简单起见,本地对象是存在的并且可以在任何实现符合ECMAScript的引擎的环境中使用。 这通常(但不总是)浏览器。
因此,例如,您的Internet Explorer或您的Google Chrome浏览器不会使您的String对象可用。 您可以使用String对象的原因是因为它是JavaScript本身的“内置”(内置)。
但是,如果您想创build一个popup式窗口,则需要使用窗口对象。 窗口对象由浏览器软件本身提供,所以它不是JavaScript本地的,但它是“浏览器对象模型”或BOM的一部分。