JavaScript(new)オブジェクトを作成するプロセス
3128 ワード
JavaScriptの世界では、オブジェクトObjectの操作は比較的柔軟であり、オブジェクトを作成することによって継承、拡張することができ、オブジェクトの属性は非常に容易に拡張されます.
したがって、オブジェクトのインスタンスフローを作成することは、このようにすることができる.
newキーワードは何をしましたか?
JavaScriptでnewキーワードを使った後、次の4つのことを意味します.
新しいオブジェクトを作成します.このオブジェクトのタイプはobjectです.
この新しいオブジェクトの内部、アクセス可能性、および[prototype]属性を配置関数に設定します.
コンストラクタを実行します.thisキーが言及されたとき、新しく作成されたオブジェクトの属性を使用します.新規作成したオブジェクトを返します.作成方法で「原型なし」の場合を除きます.
新しいオブジェクトの作成に成功した後、新しいオブジェクトにない属性を呼び出すと、JavaScriptはプロトタイプチェーンを延長して、対応するコンテンツを層ごとに検索します.これは伝統的な「類相続」に似ています.
注意:第二の点でいう「プロトタイプ」属性に関しては、一つのオブジェクトが作成された時にのみ機能します.例えば、newキーワードを使って、Object.creatを使って、字面的な意味に基づく(関数はデフォルトはFuntions.prototypeで、数字はNumber.prototypeなどとしてデフォルトです.).Object.get ProttypeOfにしか読めません.この値を設定または読み込みする他の方法はありません.
MDNゲート
ユーザー定義のオブジェクトを作成するには、2ステップが必要です.
オブジェクトの種類を作成関数で定義します.オブジェクトインスタンスをnewで作成します.
オブジェクトの種類を作成するには、名前と属性を指定する関数を作成します.オブジェクトの属性は、他のオブジェクトを指すことができます.以下の例を参照してください.
コードnew Person(…)が実行されると、次のようなことが発生します.
Person.prototypeから引き継ぐ新しいオブジェクトが作成されます.
指定されたパラメータを用いてコンストラクションPersonを呼び出し、新たに作成されたオブジェクトにthisをバインドします.new Personはnew Person()と同じで、つまりパラメータリストが指定されておらず、Personはいかなるパラメータコールも持たない場合です.
構造関数で返したオブジェクトがnew表現の結果です.立体関数が明示的にオブジェクトを返さない場合は、ステップ1で作成したオブジェクトを使用します.(一般的には、コンストラクタは値を返しませんが、ユーザーは自動的にオブジェクトに戻り、通常のオブジェクト作成ステップをカバーするように選択できます.)
したがって、オブジェクトのインスタンスフローを作成することは、このようにすることができる.
function Person(name , age){
this.name = name;
this.age = age;
console.log(this); // Person {name: "neo", age: "23"}
//return this;
}
var p1 = new Person('neo','10');
console.log(p1.name);
:
function Person(name , age){
this.name = name;
this.age = age;
console.log(this); //window
return this;
}
var p1 = new Object(); //var p1 = {}
p1 = Person('neo','23');
console.log(p1.name);
newキーワードは何をしましたか?
JavaScriptでnewキーワードを使った後、次の4つのことを意味します.
新しいオブジェクトを作成します.このオブジェクトのタイプはobjectです.
この新しいオブジェクトの内部、アクセス可能性、および[prototype]属性を配置関数に設定します.
コンストラクタを実行します.thisキーが言及されたとき、新しく作成されたオブジェクトの属性を使用します.新規作成したオブジェクトを返します.作成方法で「原型なし」の場合を除きます.
新しいオブジェクトの作成に成功した後、新しいオブジェクトにない属性を呼び出すと、JavaScriptはプロトタイプチェーンを延長して、対応するコンテンツを層ごとに検索します.これは伝統的な「類相続」に似ています.
注意:第二の点でいう「プロトタイプ」属性に関しては、一つのオブジェクトが作成された時にのみ機能します.例えば、newキーワードを使って、Object.creatを使って、字面的な意味に基づく(関数はデフォルトはFuntions.prototypeで、数字はNumber.prototypeなどとしてデフォルトです.).Object.get ProttypeOfにしか読めません.この値を設定または読み込みする他の方法はありません.
MDNゲート
ユーザー定義のオブジェクトを作成するには、2ステップが必要です.
オブジェクトの種類を作成関数で定義します.オブジェクトインスタンスをnewで作成します.
オブジェクトの種類を作成するには、名前と属性を指定する関数を作成します.オブジェクトの属性は、他のオブジェクトを指すことができます.以下の例を参照してください.
コードnew Person(…)が実行されると、次のようなことが発生します.
Person.prototypeから引き継ぐ新しいオブジェクトが作成されます.
指定されたパラメータを用いてコンストラクションPersonを呼び出し、新たに作成されたオブジェクトにthisをバインドします.new Personはnew Person()と同じで、つまりパラメータリストが指定されておらず、Personはいかなるパラメータコールも持たない場合です.
構造関数で返したオブジェクトがnew表現の結果です.立体関数が明示的にオブジェクトを返さない場合は、ステップ1で作成したオブジェクトを使用します.(一般的には、コンストラクタは値を返しませんが、ユーザーは自動的にオブジェクトに戻り、通常のオブジェクト作成ステップをカバーするように選択できます.)