JavaScript継承メカニズムの実現(続き)
4932 ワード
1.オブジェクト伪装原理:构造関数はthisキーワードを使用して、すべての属性と方法に値を付けます.すなわち、クラス宣言の构造関数方式を使用します.
コンストラクタは一つの関数なので、クラスAのコンストラクタをクラスBの方法にして呼び出します.クラスBはクラスAの構造関数で定義された属性と方法を受け取ります.
たとえば:
次のように定義されるクラスAとクラスB:
しかしこの方法は中国では、thisが所属する対象を指しています.この原理は、構造行数としてではなく、Class Aを従来の関数として継承機構を確立する.
次のように構造関数Class Bを使って継承機構を実現できます.
すべての新しい属性と新しい方法は、新しい方法のコードラインを削除して定義しなければなりません.それ以外の場合、クラスの関連する属性と方法をカバーすることがあります.
この継承方式の流行によって、ECMAScriptの第三版はFunctionオブジェクトに二つの新しい方法、すなわちcall()とappy()を加えました.
2.コール方法
call()法は古典的な対象と偽る方法と最も似た方法である.その最初のパラメータはthisのオブジェクトとして使用されます.他のパラメータは直接関数自身に伝えられます.たとえば:
sayColor()関数に付与すべきthisキーワードの値はobjである.二番目と三番目のパラメータは文字列です.これらはsayColor関数のパラメータprefixとsuffixと一致し、最後にメッセージ「Theカラーred,a very nice色inded.」を生成する.
この方法を継承機構の対象と偽る方法とともに使用するには、最初の3行の割り当て、呼び出し、削除を置き換えるだけでよい.
3.アプリ()方法
apply()法には2つのパラメータがあり、thisのオブジェクトと関数に渡すパラメータと配列として使用されています.たとえば:
「The Color is red,a niceカラーed.」
この方法は、前の3行の割り当て、呼び出し、および削除のための新しい方法のコードを置き換えるためにも使用される.
コンストラクタは一つの関数なので、クラスAのコンストラクタをクラスBの方法にして呼び出します.クラスBはクラスAの構造関数で定義された属性と方法を受け取ります.
たとえば:
次のように定義されるクラスAとクラスB:
function ClassA(sColor){
this.color=sColor;
this.sayColor=function(){
alert(this.color);
};
}
function ClassB(sColor){
}
キーワードthisは、構造関数が現在作成しているオブジェクトを参照します.しかしこの方法は中国では、thisが所属する対象を指しています.この原理は、構造行数としてではなく、Class Aを従来の関数として継承機構を確立する.
次のように構造関数Class Bを使って継承機構を実現できます.
function ClassB(sColor){
this.newMethod=ClassA;
this.newMethod(sColor);
delete this.newMethod;
}
このコードの中で、Class Aに方法newMethodを与えました.この方法を呼び出して、Class Bの構造関数のパラメータsColorに渡す.最後の行のコードはClass Aへの参照を削除しました.これでもう呼び出しできません.すべての新しい属性と新しい方法は、新しい方法のコードラインを削除して定義しなければなりません.それ以外の場合、クラスの関連する属性と方法をカバーすることがあります.
function ClassB(sColor,sName){
this.newMethod=classA;
this.newMethod(sColor);
delete this.newMethod;
this.name=sName;
this.sayName=function(){
alert(this.name);
};
}
次の例を実行します.
var objA=new ClassA("red");
var objB=new ClassB("blue","Nicholas");
objA.sayColor();//outputs "red"
objB.sayColor();//outputs "blue"
objB.sayName(); //outputs "Nicholas"
例えば、二つのクラスのクラスがあるなら、クラスXとクラスYがあります.クラスZはこの二つのクラスを継承したいです.次のコードを使ってもいいです.
function ClassZ(){
this.newMethod=ClassX;
this.newMethod();
delete this.newMethod;
this.newMethod=ClassY;
this.newMethod();
delete this.newMethod;
}
ここには、クラスXとクラスYが同名の属性または方法を持っている場合、クラスYは後から継承されるので、優先度が高いという弊害があります.このような小さな問題以外にも、相手を騙して多継承機構を実現するのは簡単です.この継承方式の流行によって、ECMAScriptの第三版はFunctionオブジェクトに二つの新しい方法、すなわちcall()とappy()を加えました.
2.コール方法
call()法は古典的な対象と偽る方法と最も似た方法である.その最初のパラメータはthisのオブジェクトとして使用されます.他のパラメータは直接関数自身に伝えられます.たとえば:
function sayColor(sPrefix,sSuffix){
alert(sPrefix+this.color+sSuffix);
};
var obj=new Object();
obj.color="red";
//outputs "The color is red,a very nice color indeed."
sayColor.call(obj,"The color is ",", a very nice color indeed.")
この例では、関数sayColor()は、オブジェクト外で定義されており、たとえオブジェクトに属さなくても、キーワードthisを参照することができる.オブジェクトのobjのカラー属性は「red」に等しい.call()メソッドを呼び出した場合、最初のパラメータはobjです.sayColor()関数に付与すべきthisキーワードの値はobjである.二番目と三番目のパラメータは文字列です.これらはsayColor関数のパラメータprefixとsuffixと一致し、最後にメッセージ「Theカラーred,a very nice色inded.」を生成する.
この方法を継承機構の対象と偽る方法とともに使用するには、最初の3行の割り当て、呼び出し、削除を置き換えるだけでよい.
function ClassB(sColor,sName){
//this.newMethod=classA;
//this.newMethod(sColor);
//delete this.newMethod;
Class.call(this,sColor);
this.name=sName;
this.sayName=function(){
alert(this.name);
};
}
ここで、クラスAのキーワードthisを新たに作成したクラスBオブジェクトに等しくしたいので、thisは最初のパラメータです.第二のパラメータsColorは両方にとって唯一のパラメータです.3.アプリ()方法
apply()法には2つのパラメータがあり、thisのオブジェクトと関数に渡すパラメータと配列として使用されています.たとえば:
function sayColor(sPrefix,sSuffix){
alert(sPrefix+this.color+sSuffix);
};
var obj=new Object();
obj.color="red";
//outputs "The Color is red,a very nice color indeed."
sayColor.apply(obj,new Array("The Color is ",",a very nice color indeed."));
この例は前の例と同じですが、今呼び出されたのはアプリです.apply()メソッドを呼び出した場合、最初のパラメータはまだobjであり、sayColor()に付与すべきthisキーワードの値はobjであることを説明する.第二のパラメータは、2つの文字列からなる配列であり、sayColor()のパラメータprefixとsuffixと一致する.生成されたメッセージはまだですか?「The Color is red,a niceカラーed.」
この方法は、前の3行の割り当て、呼び出し、および削除のための新しい方法のコードを置き換えるためにも使用される.
function ClassB(sColor,sName){
//this.newMethod=classA;
//this.newMethod(sColor);
//delete this.newMethod;
ClassA.apply(this,new Array(sColor));
this.name=sName;
this.sayName=function(){
alert(this.name);
};
}
同様に、最初のパラメータはまだthisです.二つ目のパラメータは一つの値カラーのみの配列です.クラスB全体のargmentsオブジェクトを第二のパラメータとしてapplyに渡すことができます.
function ClassB(sColor,sName){
//this.newMethod=classA;
//this.newMethod(sColor);
//delete this.newMethod;
ClassA.apply(this,arguments);
this.name=sName;
this.sayName=function(){
alert(this.name);
};
}
もちろん、スーパークラスのパラメータ順序がサブクラスのパラメータ順序と完全に一致している場合のみ、パラメータオブジェクトを渡すことができます.そうでない場合は、個々の配列を作成し、正しい順序でパラメータを配置しなければなりません.また、コール方法も使用できます.