JavaScriptでは、Javaのようなsuperキー呼び出し親クラスの同名メソッドをシミュレートします.
6504 ワード
JavaScriptでJavaのsuperキーワード呼び出しの親をシミュレートします.
1つ目の方法(公式正統):
第2の方法(個人実験):サブクラスに親と同じ名前のメソッドが現れる場合、親の同じ名前のメソッドの論理を再利用したい場合は、サブクラスのメソッドをインスタンスメソッドとして定義し、サブクラスのprototypeプロパティにメソッドを追加しません.これにより、サブクラスの同名インスタンスメソッドで「サブクラス名.prototype.親クラス同名メソッド名」を使用すると、Javaでのsuper()の実装をシミュレートできます.
この方式は実現できるが、まだ検証が必要だ.
1つ目の方法(公式正統):
(function(){
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>function SuperClass(){
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>alert("SuperClass Constructor !");
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/*this.add = function(){
<span style="white-space:pre"> </span>alert("this is SuperClass !");
<span style="white-space:pre"> </span>};*/
<span style="white-space:pre"> </span>};
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>SuperClass.prototype.add = function(){
<span style="white-space:pre"> </span>alert("this is SuperClass !");
<span style="white-space:pre"> </span>};
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>function SubClass(){
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>alert("SubClass Constructor !");
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>SuperClass.apply(this); // ,
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>/*
<span style="white-space:pre"> </span>this.add = function(){
<span style="white-space:pre"> </span>alert("this is SubClass !");
<span style="white-space:pre"> </span>return SuperClass.prototype.add.apply(this, arguements); // add ,
<span style="white-space:pre"> </span>};
<span style="white-space:pre"> </span>*/
<span style="white-space:pre"> </span>}
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>SubClass.prototype = new SuperClass();
<span style="white-space:pre"> </span>SubClass.prototype.constructor = SubClass;
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>SubClass.prototype.add = function(){
<span style="white-space:pre"> </span>alert("this is SubClass >> prefix !");
<span style="white-space:pre"> </span>SuperClass.prototype.add.apply(this); // add ,
<span style="white-space:pre"> </span>alert("this is SubClass >> suffix !");
<span style="white-space:pre"> </span>};
<span style="white-space:pre"> </span>
<span style="white-space:pre"> </span>new SubClass().add();
}());
/*
* SubClass SuperClass this add :
* <span style="white-space:pre"> </span>》》 SuperClass Constructor !
* <span style="white-space:pre"> </span>》》 SubClass Constructor !
* <span style="white-space:pre"> </span>》》 SuperClass Constructor !
* <span style="white-space:pre"> </span>》》 this is SubClass !
*
*
* SubClass add ,SuperClass this add
* <span style="white-space:pre"> </span>》》 SuperClass Constructor !
* <span style="white-space:pre"> </span>》》 SubClass Constructor !
* <span style="white-space:pre"> </span>》》 SuperClass Constructor !
* <span style="white-space:pre"> </span>》》 this is SuperClass !
*
* , :
* <span style="white-space:pre"> </span>》》 SuperClass Constructor !
* <span style="white-space:pre"> </span>》》 SubClass Constructor !
* <span style="white-space:pre"> </span>》》 SuperClass Constructor !
* <span style="white-space:pre"> </span>》》this is SubClass >> prefix !
* <span style="white-space:pre"> </span>》》 this is SuperClass !
* <span style="white-space:pre"> </span>》》this is SubClass >> suffix !
*/
第2の方法(個人実験):サブクラスに親と同じ名前のメソッドが現れる場合、親の同じ名前のメソッドの論理を再利用したい場合は、サブクラスのメソッドをインスタンスメソッドとして定義し、サブクラスのprototypeプロパティにメソッドを追加しません.これにより、サブクラスの同名インスタンスメソッドで「サブクラス名.prototype.親クラス同名メソッド名」を使用すると、Javaでのsuper()の実装をシミュレートできます.
function SuperClass(){
<span style="white-space:pre"> </span>
}
SuperClass.prototype.func = function(){
<span style="white-space:pre"> </span>alert("SuperClass's func");
};
function SubClass(){
<span style="white-space:pre"> </span>this.func = function(){ //
<span style="white-space:pre"> </span><strong>SubClass.prototype.func(); // Java super </strong>
<span style="white-space:pre"> </span>alert("SubClass Instance Function ! ");
<span style="white-space:pre"> </span>};
};
SubClass.prototype = new SuperClass();
SubClass.func = function(){ //
<span style="white-space:pre"> </span>alert("SubClass's Function !");
};
window.onload = function(){
<span style="white-space:pre"> </span>new SuperClass().func();
<span style="white-space:pre"> </span>new SubClass().func();
<span style="white-space:pre"> </span>SubClass.func();<span style="white-space:pre"> </span>// SubClass
<span style="white-space:pre"> </span>SubClass.prototype.func(); // SuperClass func()
<span style="white-space:pre"> </span>new SuperClass().func();
};
この方式は実現できるが、まだ検証が必要だ.