Javascript无参数和有参数类继承问题解决方法
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Javascript无参数和有参数类继承问题解决方法,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1607字,纯文字阅读大概需要3分钟。
内容图文
![Javascript无参数和有参数类继承问题解决方法](/upload/InfoBanner/zyjiaocheng/360/4c646082184d4dcaa023e9d96659d563.jpg)
说到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];
}
}
后记
考虑到C#、Java等高级语言都抛弃了多继承,因此,本文所讨论的也只是单继承的情况。而本文所述的继承方法,也会写成jRaiser的一个扩展,迟些发布。
内容总结
以上是互联网集市为您收集整理的Javascript无参数和有参数类继承问题解决方法全部内容,希望文章能够帮你解决Javascript无参数和有参数类继承问题解决方法所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。