楼主的代码里还有两个地方没有讲清楚:
1、Parent类里的属性若是一个对象的时候,不使用 Parent.call(this); 是没有办法完美继承的(特别是在多例运行的时候)
2、你没有对 ChildClass 的constructor做修正,你可以看看你子类的 constructor 还正不正确?
1、Parent类里的属性若是一个对象的时候,不使用 Parent.call(this); 是没有办法完美继承的(特别是在多例运行的时候)
2、你没有对 ChildClass 的constructor做修正,你可以看看你子类的 constructor 还正不正确?
解决方案 »
- 用js实现在网页上弹出输入信息的模式窗口
- 为什么当点击下面回复链接时只能触发body的click事件,而不能继续触发链接的click事件。点击上面链接时正常。纠结……谁来帮帮我……
- 来点有意义的东西,谁能用javascript 实现 神经网络 算法 顶着有分
- 求像OE里那个“发送/接受”类似的采单代码~谢谢
- 如何不刷新页面上方导航栏和个人信息栏,但是浏览器地址却改变
- 请问这样的菜单哪里有?
- 在FRAMESET中,如何判断某个frame 有没有被加载完?请教
- 如何让file控件的那个text框不显示?
- 各位前辈,虚心请教个问题!如何做一方法,处理带有";"的字符串?
- js文件加载失败
- JS兼容问题,IE正常,FF不起作用
- 有没有比较好看的帧结构?
不过虽然子类实例的constructor已经被修改了,可是调用链条依然能完成子类对象的正确构建不会出现属性或者方法的丢失。所以我想留在下一次总结constructor和prototype的时候再分析,如果前辈能告诉我不修正constructor会造成什么影响,不胜感激!
关于prototype chain,可以参见:
http://www.v-ec.com/dh20156/article.asp?id=157
"最后一句发生的效果就是将父类所有属性和方法连接到子类的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
小弟有研究了一下constructor,发现无论我们是否修正constructor,除非我们做如下判断:new SubClass().contructor==SubClass此时不修正返回的结果是会让人迷惑的,其他情况下我们用instanceof去判断的话也没有区别,再有第三层的继承也没有别的问题。Anyway,修正也是一种好的OO习惯,我们还是应该提倡。至于yonghengdexingxing说的"构造函数的参数"是一个类层次的...还有原文中出现的new Person(this.name),目的仅仅是为了揭示原型方式的本质,不好意思笔者应该在加入了错误的代码时有更直白的说明。就像开始说的,个人认为Js的继承已经做得很不错的,一点拙见!