为何须要prototype

起首,上一篇文章详细分析了原型属性本身属性的区分,但为了让人人更邃晓一点,所以这里讲一下为何须要原型。但要讲原型就必须讲组织函数,讲组织函数就必须讲对象。起首来看看对象

新建一个对象的要领:

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一次,又能完成及时更新。

    原文作者:Enm
    原文地址: https://segmentfault.com/a/1190000000653327
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞