本机对象和宿主对象之间有什么区别?

ppe*_*her 84 javascript

后者是否只是引用由自定义构造函数创建的非原始函数对象(例如,var bird1 = new Bird();)?

Šim*_*das 129

这两个术语都在ECMAScript规范中定义:

原生物体

ECMAScript实现中的对象,其语义完全由此规范定义,而不是由主机环境定义.

注意本规范中定义了标准本机对象.一些本机对象是内置的; 其他可能是在执行ECMAScript程序的过程中构建的.

资料来源:http://es5.github.com/#x4.3.6

主客体

主机环境提供的对象,以完成ECMAScript的执行环境.

注意任何非本机对象都是宿主对象.

资料来源:http://es5.github.com/#x4.3.8


几个例子:

本地对象:Object(构造函数), ,Date,Math,parseInt,eval串的方法,如indexOfreplace,阵列方法,...

主机对象(假设浏览器环境)window,document,location,history,XMLHttpRequest,setTimeout,getElementsByTagName,querySelectorAll,...

  • 给他一些例子,native object:Array,String ..,host object:window ... (8认同)
  • 自定义 custructor 怎么样?例如,我帖子中的鸟类示例 (2认同)
  • @ŠimeVidas:*"然后它是一个宿主对象."*这不正确.参见[在这个答案中]描述的`host object`的定义(http://stackoverflow.com/questions/7614317/what-is-the-difference-between-native-objects-and-host-objects/7614380#7614380 ). (2认同)
  • @ŠimeVidas,我不同意,如果`Bird`是一个用户定义的函数,它的语义是*由ES规范"完全定义"*(函数对象如何工作,如何创建,执行,与`new`运算符一起使用,等,等等)它是一个*本地对象*...我可能会回答...... (2认同)

Jac*_*esB 24

如果我们区分三种对象就更清楚了:

内置对象:String,Math,RegExp,Object,Function等-核心预定义的对象始终在JavaScript中可用.在ECMAScript规范中定义.

主机对象:对象,如window,XmlHttpRequest,DOM节点等等,这是由浏览器环境提供.它们与内置对象不同,因为并非所有环境都具有相同的主机对象.如果JavaScript在浏览器之外运行,例如作为Node.js中的服务器端脚本语言,则可以使用不同的主机对象.

用户对象:JavaScript代码中定义的对象.所以你的例子中的'Bird'将是一个用户对象.

JavaScript规范将内置对象和用户对象组合为本机对象.这是术语"本机"的非正统用法,因为用户对象显然是用JavaScript实现的,而内置函数很可能是用不同的语言实现的,就像宿主对象一样.但是从JavaScript规范的角度来看,内置和用户对象都是JavaScript原生的,因为它们是在JavaScript规范中定义的,而主机对象则不是.


use*_*716 17

这是我对规范的理解.

这个:

var bird = new Bird();
Run Code Online (Sandbox Code Playgroud)

...导致简单地使用new运算符创建的本机对象.

本机对象具有以下之一的内部[[Class]]属性:

"Arguments","Array","Boolean","Date","Error","Function","JSON","Math","Number","Object","RegExp"和"String".

对你bird1来说它将是:

"宾语"

就像你创建一个函数一样:

function my_func() {
    // ...
}
Run Code Online (Sandbox Code Playgroud)

... my_func在ECMAScript中没有定义,但它仍然是内部[[Class]]的本机对象:

"功能"

宿主对象是由环境提供的对象,以便为未由规范定义的环境服务于特定目的.

例如:

var divs = document.getElementsByTagName('div')
Run Code Online (Sandbox Code Playgroud)

引用的对象divsNodeList,它以一种感觉像常规JavaScript对象的方式集成到环境中,但它没有在规范的任何地方定义.

它的内部[[Class]]属性是:

"节点列表"

这为实现设计人员提供了一些灵活性,使其能够满足环境的特定需求.

在整个规范中定义了主机对象的要求.

  • +1,我同意你的观点,`bird`和`Bird`是*本地对象*,它们是用户定义的函数(`Bird`),以及通过使用函数创建的对象(`bird`)构造函数,它的所有语义都在规范中定义.关于宿主对象,不要过分依赖`[[Class]]`内部属性,例如`window.alert`有``Function``作为其`[[Class]]`属性的值几乎全部实现,在IE上它有"对象"`,它仍然是一个宿主对象...... (2认同)