Javascript の継承は原型的であると読みましたが、それはどういう意味ですか?プログラマによって定義されたオブジェクトは、window などの事前定義されたオブジェクトのプロパティをどのように継承できますか? たとえば、自分のクラスに関数 eval() が必要です。どうすれば達成できますか?
3 に答える
から継承する必要があるかどうかという問題はさておき、これを行う方法window
を示す簡単な例を次に示します。
function Test() {
// constructor code
}
Test.prototype = window;
var t = new Test();
t.eval();
new
演算子を使用して呼び出されると、関数は、プロトタイプがオブジェクトにリンクされているTest
新しいインスタンスを作成します。関数のプロトタイプは、任意のオブジェクトにすることができます。Test
window
new
ヒント:オブジェクトの宣言には使用しないでください。Object.createは、JavaScriptオブジェクトを作成するための適切な方法です。最新のすべてのブラウザでサポートされています。他のブラウザの場合、この記事の下部に素敵なシムがあります。
http://javascript.crockford.com/prototypal.html
'new'を使用するコンストラクターの問題の1つは、誤って通常の関数のように呼び出すと、変数を使用してグローバル変数(つまり、ブラウザーの場合はウィンドウ)に変更が加えられるため、プロトタイプ関数専用に予約する必要があることですthis
。代わりにthis
使用することを好みますthat
this
new obj()
私は個人的に、、、obj()
およびをサポートするスタイルを使用していますobj.init()
。これは、1つの追加の関数ポインターである可能性がありますが、セマンティックな意味を追加すると思います。
function obj(){
var that = Object.create(obj.prototype)
//any constructor logic goes here
return that
}
obj.prototype = Object.create(Superclass.prototype)
obj.init = obj //completely optional
//other function declarations
obj.prototype.someFunction = function(){
//logic for someFunction
}
あなたは正確に何を達成したいですか?プロトタイプ継承の最も簡単な方法 (最善ではない) を次に示します。
var obj1=new Object1Constructor();
var obj2=new Object2Constructor();
obj2.prototype=obj1;
obj1
のすべてのプロパティを継承することを意味します。obj2
主なことを忘れてしまいました: eval==evil;
更新: 上記のコードで間違いを犯しました。それは継承ではありません。更新されたコードは次のとおりです。
var Object1Constructor=function(){ // one object constuctor
//properties definition goes here
}
var Object2Constructor=function(){ // another object constuctor
//properties definition goes here
}
Object2Constructor.prototype=new Object1Constructor();
var obj=new Object2Constructor();
そして、それが継承です。obj
プロパティがObject2Constructor
andで定義されるようになりましたObject1Constructor
- 親の「クラス」。以下のCMSのコメントを参照してください。彼は完全に正しいです。