一般に、JavaScript のオブジェクトはプロトタイプへのポインターと、それ自身のプロパティのリストです。 JavaScript では、オブジェクトの作成時にコピーオンライトの概念が使用されます。
コンストラクターのみがプロトタイプ属性を持ちます。プロトタイプチェーンの継承は、コンストラクターのプロトタイプ属性を指す新しいポインターを作成します。
プロトタイプ属性が特別である理由は、JavaScript で属性を読み取るときのトラバーサル メカニズムによるものです。本質的には、これは単なる普通のポインタです。
コンストラクターには以下が含まれます:
1.Object
2.Function
3.Array
4.Date
5.String
いくつか例を挙げてみましょう
コードをコピーします
しかし、次のように変更すると
person.prototype = new Animal();
person.prototype.constructor = person; time p2. コンストラクターは正しく、person を指しており、p2 が person クラスのインスタンスであることを示していますが、新たな問題が発生します。現時点では、目標 2 は達成されていますが、目標 1 は未達成です。
目的 1 と目的 2 はこの時点で矛盾しています。プロトタイプはこの時点で 2 つの相反する意味を表現しているため、
1 は親クラスが誰であるかを示します。
したがって、prototype 属性を直接使用して親クラスが誰であるかを示すことはできませんが、親クラスが誰であるかを知るには getPrototypeOf() メソッドを使用します。
コードをコピー
コードは次のとおりです。
person.prototype = new Animal();
person.prototype.constructor = person;
これら 2 つの概念を分離します
最後に要約します:
コード var p = new Person() が実行されると、new は次のことを行います:
空のオブジェクトを作成する
Person.prototype へのポインターを作成します
this キーワードを使用してこのオブジェクトをコンストラクターに渡し、コンストラクターを実行します。
Person.prototype = Animal.prototype を使用して person が Animal から継承していることを示す場合、instanceof メソッドは p も Animal のインスタンスであることを示し、true を返します。このメソッドが使用されない理由は次のとおりです。次の 2 つの理由:
1.new は新しいオブジェクトを作成します。これにより、 person.prototype.constructor = person を設定すると、Animal.prototype.constructor の値が person に変更されることを回避できますが、この新しく作成されたオブジェクトにコンストラクター インスタンス属性が動的に与えられます。そのため、インスタンスの属性コンストラクターは Animal.prototype.constructor をカバーし、 Person.prototype.constructor と Animal.prototype.constructor が分離されます。
2. 動物自身のこのオブジェクトの属性を人に渡すことはできません
hasOwnProperty() メソッドを使用すると、インスタンスのプロパティにアクセスするときとプロトタイプのプロパティにアクセスするときが明確になります。