1. 原因
その日は、prototype.js を使用したので、数行読んだだけで混乱してしまいました。理由は、js のオブジェクト指向の性質にあまり詳しくなかったからです。と百度でググって、やっとわかったので記念に書きます^_^。
prototype.js コード スニペット
varクラス = {
create: function() {
return function() {
this.initialize.apply(this , argument)
}
}
}
/ / クラスの使用方法は次のとおりです。
var A = Class.create();
A.prototype={
initialize:function(v){
this .value=v; }
showValue: function(){
alert(this.value);
}
}
var a('helloWord!'); );//ポップアップダイアログボックス helloWord!
l 初期化とは何ですか?
l apply メソッドは何をしますか?
引数変数についてはどうですか?
l 新しい A の後に初期化メソッドが実行されるのはなぜですか?
答えを見つける:
2. オブジェクト指向 Js
初期化とは何ですか? それは、クラスのコンストラクターとして使用される、メソッドを表す単なる変数です。
その特定の機能は js のオブジェクト指向の性質によってサポートされています。では、js のオブジェクト指向の性質はどのようなものでしょうか? Javaとの類似点と相違点は何ですか?
コードを見てください:
var ClassName = function(v ){
this.value=v;
this.getValue=function(){
return this.value;
this.setValue=function(v) ){
this .value=v;
}
}
では、JS の関数とクラスの違いは何でしょうか?
実際には、ClassName は関数であり、new の後に出現する場合、オブジェクトを構築するためのコンストラクターとして使用されます。
など コードをコピー
コードは次のとおりです。 var objectName1 = new ClassName(“a ”);//オブジェクト
を取得します。ここで、objectName1 は ClassName コンストラクターの実行後に取得されたオブジェクトであり、ClassName 関数内のこれは、new の後に構築されたオブジェクトを参照するため、objectName1 は1 つのプロパティと 2 つのメソッドになります。これらは次のように呼び出すことができます:
alert(objectName1.getValue());// ダイアログ hello
alert(objectName1.value);// ダイアログ hello
その後
コードをコピー
コードは次のとおりです。var objectName2 = ClassName("b"); //オブジェクトを取得します
objectName2 は何を取得しますか?明らかに、これはメソッドの戻り値です。ここでは ClassName が通常の関数として使用されています (ただし、最初の文字は大文字です)。しかし、先に書き込んだ ClassName には戻り値がないため、objectName2 は不明になります。 では、「b」は誰に割り当てられるのでしょうか。ここではオブジェクトは生成されませんが、このメソッドは単に実行されるだけなので、このメソッドを呼び出すオブジェクト ウィンドウにこの "b" が割り当てられます。その証拠は次のとおりです:
var objectName2 = ClassName("b");/ /get An object
alert(window.value); //Dialog b
したがって、JS の関数はすべて同じですが、その用途は異なる場合があります (オブジェクトの構築またはプロセスの実行に使用されます)。
本題に戻りましょう。初期化とは何ですか?
create: function() {
return function() {
this.initialize.apply(this , argument)
}
}
}
var A = Class.create();
このコードは関数を構築し、それを A にコピーします。この関数は
this.initialize.apply(this , argument);
そして、この後者のメソッドはコンストラクターとして使用されます。このコンストラクターを使用してオブジェクトを構築すると、構築されたオブジェクトの初期化変数によって apply() メソッドが実行されます。 apply() の目的については後で説明し、初期化について引き続き説明します。このように、オブジェクトを初期化する際にinitializeに問い合わせることになります(問い合わせ方法はapplyにより異なります)。
次に
A.prototype= {
初期化:function(v){
this .value=v;
}
showValue:function(){
alert(this.value);
とはどういう意味ですか?
プロトタイプとは「試作品」という意味です。 A は function() であり、A です。プロトタイプは関数内の変数であり、実際にはオブジェクトです。このオブジェクトがどのようなメソッドを持っていても、関数によって生成されたオブジェクトにはそれらのメソッドが含まれるため、
var a = new A('helloWord!');
a. showValue();// ダイアログ ボックスをポップアップします。こんにちはワード!
そのため、オブジェクト a には初期化メソッドもあります。それだけでなく、A によって構築されたすべてのオブジェクトには初期化メソッドがあります。前述したように、コンストラクターは構築中に呼び出され、initialize はコンストラクター内で呼び出されます。 apply メソッドなので、initialize は new A('helloWord!') のときに apply メソッドを呼び出します。これは初期化メソッドを呼び出すことです。
3. call() と apply()
apply() の勉強を始めましょう。インターネットでいくつかの情報を見つけて、それを自分の研究と組み合わせて call() と apply() を理解しました。 ( ) 関数。関数は基本的に同じです。 function().call(object,{},{}...) または function().apply (object,[...]) の関数は、オブジェクト object が関数を呼び出すことです。ここでの () の違いは、呼び出しパラメータが 2 番目から関数に渡され、「,」で区切って順番にリストできることです。 apply には 2 つのパラメータしかなく、2 番目のパラメータは関数に渡されるすべてのパラメータを格納する配列です。 this.initialize.apply(this , argument);
とはどういう意味ですか?
ここで最初の this は、new でコンストラクターを呼び出した後に生成されたオブジェクトを参照します。これは前の a であるため、当然、2 番目の this も同じオブジェクトを参照する必要があります。すると、この文は、 this (つまり a) は、initialize メソッドを呼び出し、パラメータは引数オブジェクト (パラメータの配列オブジェクト) であるため、コンストラクタが実行されると、オブジェクト a は、initialize メソッドを実行して初期化することになります。 「初期化」という言葉と一致しているということは、正しいことを意味します。
では、初期化メソッドを実行するためのパラメータはどのように渡されるのでしょうか?
4. 引数オブジェクト
このコードですべてを説明できます: function test(){
alert(引数の種類);
for(var i=0; i
alert (引数[i]);
}
}
テスト("1","2","3");
実行後、alert(typeof argument); はオブジェクトを表示し、引数がオブジェクトであることを示します。その後、1、2、3 が順番に再生されます。説明引数は、呼び出し関数の実際のパラメータ グループです。
コードをコピー
return function() {
this.initialize.apply(this , argument);
}
}
}
引数はcreate によって返される構造体 関数の実際のパラメータ グループ。
var a = new A('helloWord!');
'helloWord!' が実際のパラメータ グループである場合 (文字列は 1 つだけです)、これは apply メソッドに渡され、initialize の呼び出し時に初期化関数の初期化関数にパラメータとして渡されます。