例子1:
function Class(){}var  a = new Class();Class.prototype.name = 2;alert(a.name );例子2:
function Class(){}var  a = new Class();Class.prototype = {name :2};alert(a.name );我的问题是: 为什么2个都属于为对象添加属性的方法 , 例子2却成了重写对象原型了呢?  例子1 为什么又不是重写对象原型呢?  他们的区别在哪里?

解决方案 »

  1.   

    因为 Class.prototype 就代表对象原型。那么你 Class.prototype = {name :2}; 这样给原型重新赋值,自然就等于重新定义了。而Class.prototype.name = 2; 是在原型之下增加了一个子成员。你赋值的是Class.prototype.name,不是Class.prototype。(这个好像是明摆着的吧)建议你不要一上来就看这些。一方面可以先从熟悉普通JS来体会,一方面应该先看看面向对象编程的概念,回头再来看这些,否则就很容易困惑了。
      

  2.   

    因为{name :2}是一个对象的引用,把这个引用给了原型,原型就指向了这个对象
      

  3.   


    既然你说的是被重新定义下 那么看下 下面这例子:
    function ClassA(num ){
    this.num = num;
    }var c1 = new ClassA(2);ClassA.prototype = {

    construtor: ClassA,

    fn : function(){
    alert(this.num);
    }
    }   //重新定义//c1.fn();var c2 = new ClassA(3);c2.fn();//重新定义后 为什么this.num属性还存在?
    问题是:如果真如你所说的那样被重新定义了 那么为什么原有的this.num属性还存在 ?
      

  4.   

    当然存在,this.num是c2这个对象的属性,跟原型对象没有关系吧
    要是给楼主画个图片就容易理解了,建议楼主看看javascript高级程序设计这本书,里面讲解的特别到位
      

  5.   

    当你new的时候 新建了一个object对象
    这个object对象的构造 使用的是 你new的时候的function(也即原型是那个function 的 prototype)
    你说的this.num 指向的是 object。num
    假定查找num,this在查找 object上不存在num 则从关联的原型中查找
      

  6.   

    当对象本身存在某成员时,将不再从原型链上查找。你举的例子本身就有点问题,下面的可能更适合你的例证
    function ClassA(num ){
    }var c1 = new ClassA(2);
    ClassA.prototype.num = 2;
    ClassA.prototype = {
        fn : function(){
            alert(this.num);
        }    
    }   //重新定义
    var c2 = new ClassA(3);
    c2.fn();//这时num将不存在了