javascript的prototype

是用来在同一个类的不同对象之间共享数据,方法的东西

//定义一个类
function Test(name){  
test.print=function(){"打印出啦嘿嘿嘿"};  
this.name=name;  
this.printName=function(){console.log(name)};  
}

var a=new Test('a')

var b=new Test('b')

在这里,对象a,b都可以正常使用printName方法,但是,不能直接使用print方法。因为print方法是定义在Test类上面的,相当于静态方法,无法被对象访问,比较坑爹,因为java里面对象是可以访问类的静态方法的,只是不建议这么做(应该是说,强烈不建议,这句话在官方doc和任何一本教科书里面都应该加粗加下划线)。

这倒也无所谓,但是考虑到js是一种运行在浏览器的脚本语言,它没有java这么大的后台,可以肆意挥霍内存。不同的对象,分别new一个各自的属性值,简单的属性还好,可是方法就有点坑了。因为方法printName本身就是一个对象,在上面的代码里面,相当于a,b在new的时候,同时生成了两个printName对象,这不科学。

这时候,prototype的用处就很容易解释了

//定义一个类
function Test(name){  
test.print=function(){"打印出啦嘿嘿嘿"};  
this.name=name;  
this.printName=function(){console.log(name)};  
}

Test.prototype.alertName=function(){alert(this.name);};  
Test.prototype.arr=[];  
var a=new Test('a');  
var b=new Test('b');  
a.arr.push("a");  
b.arr.push("b");  

上面的代码中,在定义完Test类之后,手动调用prototype,赋予了它一个方法和属性。这两个属性,可以在对象之间共享。所以,在调用a,b的alertName时,调用的是同一个方法对象。而a,b调用arr.push时,也是在填充同一个数组,这个很容易得到验证。

刘摸鱼

退堂鼓表演艺术家

杭州