起首,上一篇文章详细分析了原型属性和本身属性的区分,但为了让人人更邃晓一点,所以这里讲一下为何须要原型。但要讲原型就必须讲组织函数,讲组织函数就必须讲对象。起首来看看对象。
新建一个对象的要领:
1.new Object:
var newObj = new Object;
newObj.name = "keti";
newObj.color = "red";
newObj.changeColor = function(color){
newObj.color = color;
}
这类要领看上去很蠢,所以我们找到另一种要领:运用literal直接竖立,看上去要文雅很多:
2.literal
var newObj = {
name: "keti";
color: "red";
changeColor: function(color){
newObj.color = color;
}
}
运用literal来罕见对象好像很不错,比较直观,两个卷括号括起来就是个对象嘛,多清楚清楚明了。然则假如你要竖立一系列构造类似的对象,岂非要如许一个个写吗?作为程序员我们的遵照的理念就是尽量削减反复,也就是有名的DRY(Don’t Repeat Youself)。所以我们是没法容忍这么愚昧的事变发作的,因而就有了组织函数,跟类有点类似,但我们这里不议论类。组织函数就是竖立一个模板,不绑定数据,只供应架构,你只需把相干数据填充到模板里就可以够天生一个新的对象了:
3.组织函数
function NewObj(name,color){
this.name = name;
this.color = color;
this.changeColor = function(c){
this.color = c;
}
}
var newObj1 = new NewObj("keti","red");
上面代码中,new是一个组织器,NewObj是我们竖立好的模板,填入数据,赋给变量newObj1,ok,新的对象就如许天生了。
到此竖立对象的要领好像已很不错了,但仔细观察我们还发现了新的题目:关于changeColor()这个要领事实上对一切instance来说是雷同的,也就是说能够同享,不像name和color那样须要绑定给每一个instance。而组织函数这类情势每次都会把本身的属性悉数copy一份给每一个instance,这就造成了不必要的糟蹋;而且,当我们想修正这个要领时,就必须从新天生一切的instance才取得更新,比如说:
function NewObj(name,num){
this.name = name;
this.num = num;
this.changNum = function(c){
this.num = c;
}
}
var newObj1 = new NewObj("kemi",10);
newObj1.changNum(100);
newObj1.num; //很明显是100
我现在想修正changNum()这个函数:
function NewObj(name,num){
this.name = name;
this.num = num;
this.changNum = function(c){
this.num = c*2;
}
}
newObj1.changNum(100);
newObj1.num; //依然是100,也就是说这个对象并不受我们修正的模板影响到
怎样处理这个题目呢?有一个原型对象。原型对象里的属性和要领并非像组织函数本身属性一样copy给每一个instance,而是“援用”,也能够理解为给每一个instance供应一个指向该原型对象的指针,如许每一个instance就可以找到原型对象里的属性,而很明显,这是一种同享,也就是说,当你修正了这个原型里的属性,那末一切同享该属性的instance都能取得这个修正。因而,原型正好处理了上面提到的两个题目。
function NewObj(name,num){
this.name = name;
this.num = num;
}
NewObj.prototype.changNum = function(c){
this.num = c;
}
var newObj1 = new NewObj("kemi",10);
newObj1.changNum(100);
newObj1.num; //很明显是100
NewObj.prototype.changNum = function(c){
this.num = c*2;
}//我们从新修正一下这个要领
newObj1.changNum(100);
newObj1.num; //变成200了。
为何平常情况下会把属性直接写在组织函数内,而要领经由过程prototype增加呢?这两种体式格局的区分上面实在已有所展示了:大部分的instance的属性都是差别的,比如说name,因而在组织函数内经由过程this直接绑定给instance无疑是个好计划,而要领通常是通用的,运用prototype能够让每一个instance同享同一个要领,而不必每一个都copy一次,又能完成及时更新。