javascript基本对象是:Number, String, Boolean, null, undefined 在ES6中新增了Symbol。这些基本类型存储在栈中。而Function,Object, Array等数据类型存储在堆中。引用类型存储在栈中,保存的是实际内存的地址,指向堆中的数据。
内置对象有哪些:
数据封装类的有:Object, Array, Number, String, Boolean。
其它对象:Function, Arguments, Math, Date, RegExp。
<b> Object是所有对象的父对象。</b>
<b> javascript有内置对象和原生对象,内置对象是原生对象的一个子集。</b>
内置对象是在引擎初始化阶段被创建好的对象。原生对象还包括了一些在运行中动态创建的对象。
原生对象是New后的对象,内置对象不需要New。每个内置对象都是原生对象,一个内置的构造函数是一个内置的对象,也是一个构造函数。
每个对象都会在其内部初始化一个属性,就是prototype。
修改内置对象的原型:
prototype对象是实现面向对象的一个重要机制。通过prototype可以修改对象的原型。
Array.prototype.forEach = function(fn){ for ( var i = 0; i < this.length; i++ ) { fn( this[i], i, this ); } };
为Array增加一个原型方法forEach,它的功能即为“=”右侧的逻辑实现。
var test =["a", "b", "c"]; test.forEach(function(value, index, array){ assert( value, "Is in position " + index + " out of " + (array.length - 1) ); });
代码输出:PASS Is in position 0 out of 2
PASS Is in position 1 out of 2
PASS Is in position 2 out of
扩展原型有风险:
Object.prototype.keys = function(){ var keys = []; for ( var i in this ) keys.push( i ); return keys; }; var obj = { a: 1, b: 2, c: 3 }; obj.keys()obj.keys(); //["a", "b", "c", "keys"]
for循环会遍历对象所有的属性,包括原型属性、自定义属性。
为了判断一个对象是否包含自定义属性而不是原型链上的属性, 我们需要使用继承自Object.prototype的hasOwnProperty方法。 推荐使用for in时,一定使用hasOwnProperty。
注意以下原型使用方法不同:
aa.prototype.bb = XXX(给aa对象原型上增加属性bb,aa的指针没有变化。)
aa.prototype = bb(将aa对象原型指向别的对象bb,在内存的指针指向bb,发生了变化)
aa.bb=XXX(bb是对象aa的一个自定义属性,没有扩展原型的属性。)