先来看几段代码:
var a = [1,2,3];
var b = [1,2,3];
console.log(a==b);//false
var a = 5;
var b = a;
b+=3;
console.log(b)//8
console.log(a)//5
var a = [1,2,3];
var b = a;
b.push(4);
console.log(b);//[1,2,3,4]
console.log(a);//[1,2,3,4]
var a = [1,2,3];
var b = a;
b = [1,2,3,4];
console.log(b);//[1,2,3,4]
console.log(a);//[1,2,3]
如上代码片段可总结得出:基本类型赋值的时候只是值的复制,对象类型赋值的时候不仅是值的复制,也是引用的传递。当我们在声明一个变量或者对象的时候,那么必然会在相对应的内存中产生一个内存地址用来存放值。这个内存地址也就是引用地址,只要是对象的赋值就会在内存中新产生一个引用。所以:基本类型的比较,值相同就行。对象类型的比较,值和引用都相同才行。
我们都知道构造函数的使用需要new一个对象方法,毫无疑问!每new一个对象的时候,都在内存中创建一个引用,在大批量创建对象的时候,对内存的消耗则是很庞大。基于内存优化,js为我们提供了一个原型对象:Prototype,通过Prototype我们可以将同类型的代码作为一个公共类使用。
Prototype(原型):去改写对象下面公共的对象或属性,让公共的方法或属性在内存中只存在一份(好处:提高性能)。
原型的概念可能比较抽象,我们可以巧妙的用css中的“class”和“style”来做类比。
原型方法、属性:class
普通方法、属性:style
原型方法像class类一样是公用的,并且优先级要低于普通方法
//普通写法
var arr = [1,2,3,4];
var arr2 = [1,2,3];
arr.sun = function(){
var result = 0;
for(var i=0;i<this.length;i++){
result += this[i];
}
return result;
}
console.log(arr.sun())//10
///////////////////////////////
arr2.sun = function(){
var result = 0;
for(var i=0;i<this.length;i++){
result += this[i];
}
return result;
}
console.log(arr.sun())//6
//原型改造
var arr = [1,2,3,4,5];
var arr2 = [1,2,3,4,5,6];
Array.prototype.sun = function(){
var result = 0;
for(var i=0;i<this.length;i++){
result += this[i];
}
return result;
}
console.log(arr.sun())//15
console.log(arr2.sun())//21
可以看出,经过原型这么一改造,不仅提高了性能而且还减少了代码量!真是美滋滋!!!