内置对象与原生对象
内置(Build-in
)对象与原生(Naitve
)对象的区别在于:前者总是在引擎初始化阶段就被创建好的对象,是后者的一个子集;而后者包括了一些在运行过程中动态创建的对象。
原生对象(New后的对象)
ECMA-262
把原生对象(native object
)定义为“独立于宿主环境的 ECMAScript
实现提供的对象”。包括如下:
1 |
Object、Function、Array、String、Boolean、Number、Date、RegExp、Error、EvalError、RangeError、ReferenceError、SyntaxError、TypeError、URIError、ActiveXObject(服务器方面)、Enumerator(集合遍历类)、RegExp(正则表达式) |
由此可以看出,简单来说,原生对象就是 ECMA-262
定义的类(引用类型)。
内置对象(不需要New)
定义:由ECMAScript实现提供的对象,独立于宿主环境,在一个脚本程序执行的开始处。
注:每个内置对象(built-in object
)都是原生对象(Native Object
),一个内置的构造函数是一个内置的对象,也是一个构造函数。
举个栗子:
1 2 3 |
Native objects: Object (constructor), Date, Math, parseInt, eval。 string 方法比如 indexOf 和 replace, array 方法, ... Host objects (假定是浏览器环境): window, document, location, history, XMLHttpRequest, setTimeout, getElementsByTagName, querySelectorAll, ... |
ECMA-262][2 只定义了两个新的内置对象,即 Global
和 Math
(它们也是原生对象,根据定义,每个内置对象都是原生对象)。
以下是ECMA-262定义的内置对象(built-in):
1 |
global、Object、Function、Array、String、Boolean、Number、Math、Date、RegExp、JSON、Error对象(Error, EvalError, RangeError, ReferenceError, SyntaxError, TypeError 和URIError) |
我们也可以修改内置对象的原型
1 2 3 4 5 6 7 8 9 10 11 |
if (!Array.prototype.forEach) { Array.prototype.forEach = function(fn){ for ( var i = 0; i < this.length; i++ ) { fn( this[i], i, this ); } }; } ["a", "b", "c"].forEach(function(value, index, array){ assert( value, "Is in position " + index + " out of " + (array.length - 1) ); }); |
以上代码将输出:
1 2 3 |
PASS Is in position 0 out of 2 PASS Is in position 1 out of 2 PASS Is in position 2 out of 2 |
注意:扩展原型是很危险的:
1 2 3 4 5 6 7 8 9 10 11 12 |
Object.prototype.keys = function(){ var keys = []; for ( var i in this ) keys.push( i s="crayon-h"> ) keys.push( i mg class="alignnone size-full wp-image-88148" src="http://jbcdn2.b0.upaiyun.com/2016/09/beee1a29ee403f160d003ac60bd7e761.png" alt="2993868520-5518de2b15e17_articlex">
原生对象(New后的对象)
由此可以看出,简单来说,原生对象就是 内置对象(不需要New)
注:每个内置对象( 举个栗子:
ECMA-262][2 只定义了两个新的内置对象,即 以下是ECMA-262定义的内置对象(built-in):
我们也可以修改内置对象的原型
以上代码将输出:
注意:扩展原型是很危险的:
|