Javascriptでの継承を少し単純化したいと思っています。私がこれまでに集めたものから、「クラス」間の「継承」を達成するための良い方法は次のとおりです。
function ParentClass() {
//Parent Constructor
}
ChildClass.prototype = new ParentClass(); //Step 1: Use parent as prototype
ChildClass.prototype.constructor = ChildClass; //Step 2: Designate appropriate constructor
function ChildClass() {
ParentClass.call(this, arguments); //Step 3: Call the parent's constructor from the child's
//Child Constructor
}
上記のラベルを付けたように、プロセスを3つの「ステップ」に分割するのが好きです(ステップ1、2、および3)。これらの3つのステップすべてを1つの関数(Javaのバックグラウンドから取得し、「extend」とラベル付けしました)に入れて、次のように関数コンストラクターオブジェクトから呼び出すことができます。
function ParentClass() {
//Parent Constructor
}
ChildClass.extend(ParentClass); //Execute steps 1, 2 and 3 all in this function
function ChildClass() {
//Child Constructor
}
これは私がこれまでに持っているものです:
Function.prototype.extend = function (parent) {
var oldConstructor = this.prototype.constructor;
this.prototype = new parent(); //Step 1
this.prototype.constructor = function (arguments) { //Step 2
parent.apply(this, arguments); //Step 3
oldConstructor(arguments);
};
}
このコンテキストでは、extend関数のステップ1と2は正常に機能しますが、ステップ3で問題が発生します。私がやろうとしているのは、子のコンストラクター関数を、親のコンストラクターを呼び出してから子のコンストラクターを呼び出す新しい関数に置き換えることです。ただし、これを実行すると、親コンストラクターが呼び出されません。問題を特定できませんでした(「this」キーワードを正しく使用していますか?)。おそらく私はこれに間違った方法でアプローチしています。これを行う関数を作ることは可能ですよね?どうすれば機能する「拡張」機能を作成できますか?
アップデート:
本当の問題は、「this」キーワードの使用にあるようです。これが私が今見ているコードです:
function ParentClass(x) {
this.value = x;
}
function ChildClass() {
}
ChildClass.extend(ParentClass);
function testtest() {
var a = new ParentClass("hello world"); //Alerts "hello world"
alert(a.value);
var b = new ChildClass("hello world"); //Alerts "undefined"
alert(b.value);
}
最初のアラートが機能し、2番目のアラートが機能しないのはなぜですか?「これ」とは、関数が実行されているコンテキストを指していると思いました。どちらの場合も、コンストラクター(aまたはb)を呼び出すオブジェクトになります。