说到Javascript的类继承,就必然离不开原型链,但只通过原型链实现的继承有着不少缺陷。
无参数类继承的问题
先看一段示例代码,实现B继承于A:
- function A() {
- }
- A.prototype.a1 = function() {
- };
- function B() {
- }
- B.prototype = new A();
- B.prototype.b1 = function() {
- };
- var b = new B();
- alert(b.constructor == A); // true
- alert(b.constructor == B); // false
这段代码的主要问 题是:
1、需要实例化A作为B的原型,此时就执行了A的构造函数。但按照面向对象的规则,实例化B之前,B及其父类A的构造函数都不应该执行。
2、更改了B的prototype,导致b.constructor不是B而是A。
有参类继承的问题
假设A和B都有两个字符串参数s1和s2,A中计算了两段字符串的总长度,B直接以s1、s2为参数调用A:
- function A(s1, s2)
- {
- this.totalLength = s1.length + s2.length;
- }
- A.prototype.a1 = function()
- {
- };
- function B(s1, s2)
- {
- }
- B.prototype = new A();
- B.prototype.b1 = function()
- {
- };
- new B(“ab”, “123″);
可以看到,这段代码中根本没有办法把s1和s2传到A,而又因为实例化A作为B的原型时没有 参数,所以出现了异常:
- s1 is undefined
解决方案
s1 和s2的作用域只在B内,要把它们传到A,就只能在B中操作,借助函数的apply方法就可以实现之:
- function B(s1, s2)
- {
- A.apply(this, arguments);
- alert(this.totalLength);
- }
接下来的问题就是如何把A的方法添加到B的原型中去。这也不 难,只要遍历A.prototype,把方法复制到B.prototype即可。要注意的是,对于同名的方法,自然是子类优先(重载), 因而不能覆盖:
- for (var m in A.prototype)
- {
- if (!B.prototype[m])
- { // 父类不能覆盖子类的方法
- B.prototype[m] = A.prototype[m];
- }
- }
分享名称:论Javascript的类继承
URL分享:http://www.shufengxianlan.com/qtweb/news33/326333.html
成都网站建设公司_创新互联,为您提供品牌网站设计、python、网页设计公司、网站收录、移动网站建设、定制网站
声明:本网站发布的内容(图片、视频和文字)以用户投稿、用户转载内容为主,如果涉及侵权请尽快告知,我们将会在第一时间删除。文章观点不代表本网站立场,如需处理请联系客服。电话:028-86922220;邮箱:631063699@qq.com。内容未经允许不得转载,或转载时需注明来源: 创新互联