Š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
串的方法,如indexOf
和replace
,阵列方法,...
主机对象(假设浏览器环境)window
,document
,location
,history
,XMLHttpRequest
,setTimeout
,getElementsByTagName
,querySelectorAll
,...
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)
引用的对象divs
是NodeList,它以一种感觉像常规JavaScript对象的方式集成到环境中,但它没有在规范的任何地方定义.
它的内部[[Class]]属性是:
"节点列表"
这为实现设计人员提供了一些灵活性,使其能够满足环境的特定需求.
在整个规范中定义了主机对象的要求.
归档时间: |
|
查看次数: |
40015 次 |
最近记录: |