<script>
function Person(){}
Person.prototype={
sayname:function(){alert('123');}
}
var person1=new Person();
person1.sayname();
</script><script>
function Person(){}
var person1=new Person();
Person.prototype={
sayname:function(){alert('123');}
}
person1.sayname();
</script>

这2段函数什么区别,,截然不同啊。

解决方案 »

  1.   

    在给你加点料,希望你能悟出来。其实这个涉及到的东西很概念,但是这确实理解原型继承和原型链的根本。好好利用搜索引擎吧
    function Person() {
    }
            var person1 = new Person(); Person.prototype.sayHello = function(){
    alert('hello');
    };
    person1.sayHello();
      

  2.   

    这就涉及到"引用"了
    因为Person.prototype,原型其实就是一个对象,对象是引用类型例子一:
    function Person(){}    
        Person.prototype={
            sayname:function(){alert('123');}
        }
        var person1=new Person();
        person1.sayname();可以看成
    var pObj = {...},//原始的原型对象
        obj = {
            sayname:function(){alert('123');}
        };
    function Person(){
    }
        Person.prototype=obj
        var person1=new Person();
        person1.sayname();
    当Person这个函数创建的时候,引擎会执行类似
    Person.prototype = pObj;将Person.prototype的引用指向pObj,而下面
    Person.prototype=obj,就使原型指向了obj的引用,所以当我们
    var person1=new Person();
    的时候,person1的原型就指向了obj的引用而例子2:
    function Person(){}    
        var person1=new Person();
        Person.prototype={
            sayname:function(){alert('123');}
        }
        person1.sayname();看成
    var pObj = {...},//原始的原型对象
        obj = {
            sayname:function(){alert('123');}
        };
    function Person(){}    
    Person.prototype = pObj;
        var person1=new Person();
        Person.prototype=obj;
        person1.sayname();
    和例子1一样,当Person创建的时候Person的原型指向了pObj,
    所以当var person1=new Person();的时候person1的原型指向了原始的原型引用pObj
    儿我们Person.prototype=obj;只是修改了引用地址,它影响到的只是后面new出来的实例,因为它并没有修改person1原型的副本
    大家都知道,引用类型类型要修改副本,是需要修改副本的属性来实现即function Person(){}    
        var person1=new Person();
        Person.prototype.sayname = function(){
            alert('123')
        };
        person1.sayname();这样才是修改原型的正确方法.
    Person.prototype={
            sayname:function(){alert('123');}
        }
    这种形式是只是用于初始化原型的时候用
      

  3.   

    抱歉,上面例子2写错了,应该是
    function Person(){}  
      var person1=new Person();
      Person.prototype={
      sayname:function(){alert('123');}
      }
      person1.sayname();看成
    var pObj = {...},//原始的原型对象
      obj = {
      sayname:function(){alert('123');}
      };
    function Person(){}  
      var person1=new Person();
      Person.prototype=obj;
      person1.sayname();
      

  4.   

    你误读了一个很重要的detail
    1、prototype是一个对象,也就是说,你用对象字面量也好,其他的方式也好,总之prototype不会从其他的原型和构造函数中继承,而只能是一个实例对象,或字面量对象。
    2、直接给prototype赋值,可以看出Person是对Person的构造函数进行引用(万物皆对象),引用的结果就是当Person构造函数用来创建Person对象时,创建时的Person原型的引用就是Person实例会继承的方法它说明一个什么问题呢
    简单的说,你的第一个是在new一个对象之前给prototype赋值的,因此new出来的person1有sayname方法是毫无疑问的
    但是第二个例子里面,由于你在new person的时候Person.prototype的引用是object,即使后面有了prototype重新引用,也不会改变之前的结果(我用的是引用这个词,我下面对我的例子解释的时候会用到)我的例子里,虽然已经new过来,但是我没有改变Person的prototype引用,只是给prototype增加了一个方法,因此后面可以使用。。
      

  5.   

    Person.prototype=..... 这个时候原型链被重写了,要知道Person.prototype里不只有方法,还有constructor,不破坏原型链的写法应该是:
        Person.prototype={
            constructor:Person,
            sayname:function(){alert('123');}
        }
      

  6.   

    其实简单来说
    prototype是一个对象,对象是引用类型的,理解了引用传递就清楚了