是用来在同一个类的不同对象之间共享数据,方法的东西
//定义一个类
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时,也是在填充同一个数组,这个很容易得到验证。