私たちは、いくつかの何をすべきかを最終的にnew演算子を把握する必要がありますか?
新しいオブジェクトを作成します。1.
2.コンストラクタの範囲は、(新しいオブジェクトに、従って、この点)新しいオブジェクトを割り当てます
3.コードのコンストラクタを実行します(新しいオブジェクトプロパティを追加します)
新しいオブジェクトを返します4。
最後にnew演算子は、いくつかの何かをする上でのショーは、我々はそれが新しい演算子の機能を達成することはありませんが、これを達成するためのステップバイステップ。
次のように人は最初のコンストラクタを定義します。
関数人(名前){ この .nameの= 名前。 } Person.prototype.sayName = 関数(){ にconsole.log(この.nameの)。 }
次のように新しいシミュレーション機能の演算子関数を作成します。
関数は、人(名前){ この .nameの= 名; } Person.prototype.sayName = 関数(){ にconsole.log(この.nameの); } 関数createPerson(){ // 1は、新たなオブジェクト作成 するvar = Oを{ }; // 2は、結合範囲を達成するために、コンストラクタを取得 するvar = _constructorを] .shift.call(引数); // アクセスできない内部新しいオブジェクトインスタンスの性質に起因3 [[プロトタイプ]の操作によって作成されます。 (__proto__である一部のブラウザ) // プロトタイプオブジェクトのコンストラクタへのポイントは、手動でバインドこれを達成します。 .__ proto__ = O _constructor.prototype; // バインド4.この変化点の範囲を適用します
_constructor.apply(O、引数)。 返すoを。 } VAR PERSON1 = createPerson(人、 'YDB' )。 person1.sayName();
この方法では、new演算子の機能を実現しています。
実際には、上記のコードは、次のように書くことができます。
関数人(名前){ この .nameの= 名; } Person.prototype.sayName = 関数(){ にconsole.log(この.nameの); } 関数createPerson(){ // 1範囲を達成するために、コンストラクタを取得します。結合 するvar _constructorは= [] .shift.call(引数); // 2は、オブジェクト作成 するvar Oを= Object.create(_constructor.prototype); // オブジェクトインスタンス内のアクセス不可能性は、新しいオペレータによって作成されているので[ [プロトタイプ]](__proto__である一部のブラウザ) // プロトタイプオブジェクトのコンストラクタにポイント。 // Object.create()メソッドは、__proto__新しく作成されたオブジェクトを提供するために、既存のオブジェクトを使用して、新しいオブジェクトを作成します。//4.結合スコープ _constructor.apply(O、引数); 戻りO; } VAR PERSON1 = createPerson(人、 'YDB' ); person1.sayName()。
以下のように、無性質Object.createを持つオブジェクトを作成することができます。
VAR 0 = Object.create(NULL)。