function test(){
this.method = function (){
}
test.prototype.method = function(){
}
}这两种方式都可以公用这个方法(通过 new 一个test,然后引用),问题是 什么时候 用第二种,什么时候用第一种?求解释!
this.method = function (){
}
test.prototype.method = function(){
}
}这两种方式都可以公用这个方法(通过 new 一个test,然后引用),问题是 什么时候 用第二种,什么时候用第一种?求解释!
第一种this动态方法,每NEW一个对象,都会产生新的函数实例,而第二种prototype方式,不管你new多少个对象出来,实际调用的只产生一个函数实例!效率上第二种高于第一种,所以一般应用都推荐使用第二种来定义方法!具体可以参考百度"javascript动态原型"
var name=name+'--'+new Date();
this.m=function(){alert(name);return this;};
this.name=name+'[prototype]';
}
test.prototype.n=function(){alert(this.name);return this;};var t1=new test('t1');
var t2=new test('t2');alert([[
t1.m==t2.m
,t1.n==t2.n]
,'{true 表示2个方法是同一个对象,flase 表示2个方法是不同对象}']);
t1.m().n();
t2.m().n();执行下
1)使用原型的写法是节约空间的 应为被实例对象引用的原型属性在读取访问时是同一个对象
2)使用非原型方法 可以通过闭包实现内部变量 原型就不行 因为原型只能看见 this 不能看见this内部
最后还是自己抉择喽 呵呵
第二种方式:JS被称为基于原型的语言,其原因在于继承是通过原型链来实现的,在第一种方式中,每个对象实例化时都会把对象的属性和方法复制一份,如果存在1000个对象,就会有1000份属性和方法--每一份都单独占据一块内在!为了避开额外的开销,JS就引入了一原型属性!
this.method = function (){
}
test.prototype.method = function(){
}
}在生成的实例中第一个 每个实例都会有一个 method 方法 所以内存占得多
但是访问的速度比第2个快 (因为是先找本身的方法 才会去找原型连上的方法)第二个 任何实例都公共这个方法
访问速度比上面的慢 因为在原型连上一个例子function test(){
this.method = function (){
alert('自己的方法')
}
test.prototype.method = function(){
alert('原型上的method')
}
}
var o = new test();//先是访问的自己的方法
o.method();
//删除自己的方法后
delete o.method;
//访问的原型上的方法
o.method();
//在删除原型连上的方法
delete test.prototype.method;
//o.method就不存在了
alert(o.method)
test.prototype.method 所有实例共享