楼主的代码里还有两个地方没有讲清楚:
1、Parent类里的属性若是一个对象的时候,不使用 Parent.call(this); 是没有办法完美继承的(特别是在多例运行的时候)
2、你没有对 ChildClass 的constructor做修正,你可以看看你子类的 constructor 还正不正确?

解决方案 »

  1.   

    谢谢前辈指教,其实我也在研究有的时候看见继承之后修正constructor的,因为修改prototype域引用之后,prototype域的constructor也会随之改变
    不过虽然子类实例的constructor已经被修改了,可是调用链条依然能完成子类对象的正确构建不会出现属性或者方法的丢失。所以我想留在下一次总结constructor和prototype的时候再分析,如果前辈能告诉我不修正constructor会造成什么影响,不胜感激!
      

  2.   

    "不过虽然子类实例的constructor已经被修改了,可是调用链条依然能完成子类对象的正确构建不会出现属性或者方法的丢失。 "这是Prototype Chain的作用!"所以我想留在下一次总结constructor和prototype的时候再分析,如果前辈能告诉我不修正constructor会造成什么影响,不胜感激!”不修正constructor,从功能上讲,对继承没有什么影响,但,既然是继承,那么应当让子类正确地告知用户,它是继承自谁,用户可以通过constructor来获知!
    关于prototype chain,可以参见:
    http://www.v-ec.com/dh20156/article.asp?id=157
      

  3.   

    呵呵,JF,支持一下 ...但似乎被楼主弄复杂了:1) 所谓的"对象冒充"说白了,就是更换this对象,然后执行函数代码....2) 对"原型方式",楼主提到
       
       "最后一句发生的效果就是将父类所有属性和方法连接到子类的prototype域上,
       这样子类就继承了父类所有的属性和方法,包括name、sayGoodbye和sayHello。"
       
       PS: 楼主是否考虑过,在子类对象中改变这些属性时会发生什么?
       
       "这种原型继承的缺陷也相当明显,就是继承时父类的构造函数时不能带参数,
       因为对子类prototype域的修改是在声明子类对象之后才能进行,
       用子类构造函数的参数去初始化父类属性是无法实现的,..."
       
       "Student.prototype = new Person(this.name);"
       
       PS: prototype就是prototype,确实没有必要和OO语言去类比起来,prototype提供的是
            沿着prototype链的共享,是一个"类"层次上的,所以"构造函数的参数"也应该是一个
            "类"层次上的,而不能是"实例"层次...   
    个人觉得这个讲得不错的:
    http://www.cnblogs.com/RicCC/archive/2008/02/15/javascript-object-model-execution-model.html
       
      

  4.   

    呵呵,欢迎大家指正,这样切磋技术才能精进!
    小弟有研究了一下constructor,发现无论我们是否修正constructor,除非我们做如下判断:new SubClass().contructor==SubClass此时不修正返回的结果是会让人迷惑的,其他情况下我们用instanceof去判断的话也没有区别,再有第三层的继承也没有别的问题。Anyway,修正也是一种好的OO习惯,我们还是应该提倡。至于yonghengdexingxing说的"构造函数的参数"是一个类层次的...还有原文中出现的new Person(this.name),目的仅仅是为了揭示原型方式的本质,不好意思笔者应该在加入了错误的代码时有更直白的说明。就像开始说的,个人认为Js的继承已经做得很不错的,一点拙见!