Javascript非参数和参数类继承问题求解方法

在Javascript的类继承中,原型链是不可避免的,但只有通过原型链才能继承。

非参数类继承问题

首先看一个示例代码,实现从a继承:

复制代码代码如下所示:

函数A(){

}

a.prototype.a1 =函数(){ };

函数B(){

}

b.prototype =新一();

b.prototype.b1 =函数(){ };

新的b();

警报(b.constructor = =一个); / /真的

警报(b.constructor = = b); / /假



这个代码的主要问题是:

1。需要将A实例化为B的原型,然后执行a的构造函数。然而,在B被实例化之前,B和它的父类a的构造函数不应该按照面向对象规则执行。

2。改变B的原型,造成b.constructor不但是B A.

关于继承的问题

假设a和b有两个字符串参数S1和S2,则两个段字符串的总长度在a中计算,而b直接与S1和S2的参数直接调用。

复制代码代码如下所示:

函数A(S1,S2){

this.totallength = s1.length + s2.length;

}

a.prototype.a1 =函数(){

};

函数B(S1,S2){

}

b.prototype =新一();

b.prototype.b1 =函数(){

};

新的b( ab)



正如您所看到的,在这个代码中没有办法将S1和S2传递给a,并且有一个例外,因为A被实例化为B原型。

复制代码代码如下所示:

S1是未定义的



解决方案

S1和S2的范围仅在B中,并将它们传递给a,只能在函数的应用方法的帮助下,才能在b中操作。

复制代码代码如下所示:

函数B(S1,S2){

A.apply(这个参数);

(此为警戒。);

}



接下来的问题是如何添加一个方法的原型,这并不难,只是在a.prototype和复制的方法b.prototype.it重点注意的是,对于同一个名字的方法,它是自然类优先(超载),因此不能盖:

复制代码代码如下所示:

对于(var m a.prototype){

如果(!b.prototype {米})方法不能覆盖{ / /父类

b.prototype { } = { } a.prototype M M;

}

}



后记

考虑到如C #,java高级语言,和其他高级语言已经放弃了多重继承,本文只是一个单一的继承。在这篇文章中描述的继承法也将被作为jraiser的延伸,这就是后来的释放。