function test(){
    this.method = function (){
    }
    test.prototype.method = function(){
    }
}这两种方式都可以公用这个方法(通过 new 一个test,然后引用),问题是 什么时候 用第二种,什么时候用第一种?求解释!

解决方案 »

  1.   

    一个是动态方法,一个是原型方法!个人看法:
        第一种this动态方法,每NEW一个对象,都会产生新的函数实例,而第二种prototype方式,不管你new多少个对象出来,实际调用的只产生一个函数实例!效率上第二种高于第一种,所以一般应用都推荐使用第二种来定义方法!具体可以参考百度"javascript动态原型"
      

  2.   

    function test(_name){
       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内部
    最后还是自己抉择喽 呵呵
      

  3.   

    var name=name+'--'+new Date();这句修改成var name=_name+'--'+new Date();
      

  4.   

    第一种方式:在函数内部,this关键字指向新创建的对象,而且你可以给它加上新的属性和方法,函数执行完毕后,新对象被赋值给你指定的变量!
    第二种方式:JS被称为基于原型的语言,其原因在于继承是通过原型链来实现的,在第一种方式中,每个对象实例化时都会把对象的属性和方法复制一份,如果存在1000个对象,就会有1000份属性和方法--每一份都单独占据一块内在!为了避开额外的开销,JS就引入了一原型属性!
      

  5.   

    this.method 相当于一个属性,当前实例独有!  test.prototype.method 所有实例共享
      

  6.   

    function test(){
      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)
      

  7.   

    this.method 是只属于当前实例的
    test.prototype.method 所有实例共享