b.prototype = new a();var cc = new a(5);
alert(cc.b);看你的构造函数a,你是由形参输入的,可是在给b的原型链上实例化时,你没有传入那这样的话,不是undefined,还能是个什么样的值呢?

解决方案 »

  1.   


    应该继续往上找啊,a有prototype的,就像第三个alert一样
      

  2.   

    首先, a.call(this, 2); 相当于 this.b = 2;
    那么你的类B 其实相当于如下function b() {
    this.b = 2;
    }
    b.prototype = {
    b: undefine,
    __proto__: { //这个是伪代码, 表示对象原型链上的原型对象
    b: 3
    }
    };然后, 你c =  new b(), 你的c对象如下c = {
    b: 2,  //第一次获取c.b
    __proto__: {
    b: undefine,  //第一次delete c.b后, 获取的c.b
    __proto__: {
    b: 3    //delete b.prototype.b后,获取的c.b
    }
    }
    }
      

  3.   

    这不是说,找到的属性值是一些特殊值,而是,看是不是能找到这个属性。你不传入参数,但是那里依然会存在这个属性啊,只是属性值是undefined而已。
      

  4.   


    那系统怎么判断呢,比如上面加入alert(b.c);也是显示undefined
      

  5.   


    那系统是怎么判断不存在还是存在但值是undefined
      

  6.   

    undefined就是不存在,  我写出来是方便比较..
      

  7.   

    上面说错了, undefined跟不存在还是有点区别.
    对象上不存在你找的属性, 才会从原型链上找, 如果原型链上也没找到, 也是会返回给你undefined的
      

  8.   

    为什么还要往上找呢?
    delete c.b; 只是删除了继承的 .prototype.b
    而并没有删掉 .prototype 你这样也删不掉
    只有 delete b.prototype.b; 才能删掉
    注意 b.prototype.b 和 c.b 是引用关系
    如果没有delete c.b;,那么 delete b.prototype.b; 也不会有实质效果:最后一个 alert 依然是 2,而不是 3
      

  9.   

    function b() {
                a.call(this, 2);
            }
            b.prototype = new a();
    这样写有什么明确的业务含义呢?
    我只想说 别把时间耗在这里
    [1] b.b --->a.call(this, 2);   b=2           
    [2]b.prototype,b--->(function a(b){this.b = b} )();     b = undefined
    [3] b.prototype.prototype.b--->a.prototype.b = 3    b = 3;3个次序看见没首先访问  [1]
    delete后 变成访问  [2]
    在delete后 变成 [3]
    这个代码完全没什么意义 就算要实现 也不会用这样的方式
      

  10.   


    书上就是这样写的,我只不过简化了下,书是Head First Javascript Programming第13章,里面有解释的感觉是有意义的,就应该写new a(),因为不知道具体的值
      

  11.   


    书上就是这样写的,我只不过简化了下,书是Head First Javascript Programming第13章,里面有解释的感觉是有意义的,就应该写new a(),因为不知道具体的值业务为重 ~~