プロトタイプ モード
function Person(){ } Person.prototype.name = "Nicholas"; Person.prototype.age = 29; Person.prototype.job = "Software Engineer"; Person.prototype.sayName = function(){ alert(this.name); }; var person1 = new Person(); person1.sayName(); //"Nicholas" var person2 = new Person(); person2.sayName(); //"Nicholas" alert(person1.sayName == person2.sayName); //true
この例では、属性とメソッドを追加するたびに、「person.prototype」と入力する必要があります。不必要な入力を減らし、プロトタイプの機能をより視覚的にカプセル化するために、次の例に示すように、すべてのプロパティとメソッドを含むオブジェクト リテラルでプロトタイプ オブジェクト全体をオーバーライドすることがより一般的です。
function Person(){ } Person.prototype = { name : "Nicholas", age : 29, job: "Software Engineer", sayName : function () { alert(this.name); } };
上記のコードでは、オブジェクト リテラルとして作成された新しいオブジェクトに person.prototype を設定しています。最終結果は同じですが、1 つの例外があります。コンストラクター プロパティは Person を指さなくなりました。以前紹介したように、関数を作成するたびにそのプロトタイプオブジェクトも同時に作成され、このオブジェクトも自動的にコンストラクター属性を取得します。ここで使用する構文は基本的にデフォルトのプロトタイプ オブジェクトを完全に書き換えるため、コンストラクター プロパティは新しいオブジェクトのコンストラクター プロパティ (Object コンストラクターを指す) になり、Person 関数を指すことはなくなります。この時点でも、instanceof 演算子は正しい結果を返すことができますが、以下に示すように、コンストラクターを通じてオブジェクトの型を決定することはできません。
var friend = new Person(); alert(friend instanceof Object); //true alert(friend instanceof Person); //true alert(friend.constructor == Person); //false alert(friend.constructor == Object); //true
ここで、instanceof 演算子を使用して Object と Person をテストすると、依然として true が返されますが、コンストラクターのプロパティは Object と等価ですが、Person と等しくありません。コンストラクターの値が本当に重要な場合は、以下に示すように、意図的に適切な値に戻すことができます。
function Person(){ } Person.prototype = { constructor : Person, name : "Nicholas", age : 29, job: "Software Engineer", sayName : function () { alert(this.name); } };
注意すべき点の 1 つは、インスタンス内のポインターはコンストラクターではなくプロトタイプのみを指すということです。
プロトタイプ オブジェクトの問題: プロトタイプ パターンには欠点がないわけではありません。まず、初期化パラメーターをコンストラクターに渡す必要がないため、すべてのインスタンスはデフォルトで同じプロパティ値を取得します。これにより、ある程度の不都合は生じますが、プロトタイプの最大の問題ではありません。プロトタイプ パターンの最大の問題は、その共通の性質によって引き起こされます。
以上がJavaScript がプロトタイプ パターンを使用してオブジェクト インスタンスを作成する方法の詳細な説明の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。