ホームページ > ウェブフロントエンド > jsチュートリアル > JS プロトタイプとプロトタイプ チェーンの最も詳細な紹介

JS プロトタイプとプロトタイプ チェーンの最も詳細な紹介

零到壹度
リリース: 2018-04-13 16:47:46
オリジナル
1631 人が閲覧しました

この記事で共有する内容は、JS プロトタイプとプロトタイプ チェーンについての最も詳細な紹介です。必要な友人はそれを参照できます。1. __proto__

JS はオブジェクトを作成します。オブジェクトまたは関数オブジェクト) には、__proto__ という組み込みプロパティがあり、それを作成したコンストラクターのプロトタイプ オブジェクトを指すために使用されます。
オブジェクト person1 には __proto__ 属性があり、それを作成したコンストラクターは Person で、コンストラクターのプロトタイプ オブジェクトは Person.prototype であるため、
person1. __proto__ == person.prototype

以下の図をご覧ください:

__proto__ 的内置属性,用于指向创建它的构造函数的原型对象。
对象 person1 有一个 __proto__属性,创建它的构造函数是 Person,构造函数的原型对象是 Person.prototype ,所以:
person1.__proto__ == Person.prototype

请看下图:

《JavaScript 高级程序设计》的图 6-1

根据上面这个连接图,我们能得到:

Person.prototype.constructor == Person;
person1.__proto__ == Person.prototype;
person1.constructor == Person;
ログイン後にコピー

不过,要明确的真正重要的一点就是,这个连接存在于实例(person1)与构造函数(Person)的原型对象(Person.prototype)之间,而不是存在于实例(person1)与构造函数(Person)之间。

注意:因为绝大部分浏览器都支持__proto__属性,所以它才被加入了 ES6 里(ES5 部分浏览器也支持,但还不是标准)。

二. 构造器

熟悉 Javascript 的童鞋都知道,我们可以这样创建一个对象:

var obj = {}
ログイン後にコピー

它等同于下面这样:

var obj = new Object()
ログイン後にコピー

obj 是构造函数(Object)的一个实例。所以:

obj.constructor === Object
obj.__proto__ === Object.prototype
ログイン後にコピー

新对象 obj 是使用 new 操作符后跟一个构造函数来创建的。构造函数(Object)本身就是一个函数(就是上面说的函数对象),它和上面的构造函数 Person 差不多。只不过该函数是出于创建新对象的目的而定义的。所以不要被 Object 吓倒。


同理,可以创建对象的构造器不仅仅有 Object,也可以是 Array,Date,Function等。
所以我们也可以构造函数来创建 Array、 Date、Function

var b = new Array();
b.constructor === Array;
b.__proto__ === Array.prototype;var c = new Date(); 
c.constructor === Date;
c.__proto__ === Date.prototype;var d = new Function();
d.constructor === Function;
d.__proto__ === Function.prototype;
ログイン後にコピー

这些构造器都是函数对象:

函数对象

三.  原型链

小测试来检验一下你理解的怎么样:

  1. person1.__proto__ 是什么?

  2. Person.__proto__ 是什么?

  3. Person.prototype.__proto__ 是什么?

  4. Object.__proto__ 是什么?

  5. Object.prototype__proto__ 是什么?

答案:
第一题:
因为 person1.__proto__ === person1 的构造函数.prototype
因为 person1的构造函数 === Person
所以 person1.__proto__ === Person.prototype

第二题:
因为 Person.__proto__ === Person的构造函数.prototype
因为 Person的构造函数 === Function
所以 Person.__proto__ === Function.prototype

第三题:
Person.prototype 是一个普通对象,我们无需关注它有哪些属性,只要记住它是一个普通对象。
因为一个普通对象的构造函数 === Object
所以 Person.prototype.__proto__ === Object.prototype

第四题,参照第二题,因为 Person 和 Object 一样都是构造函数

第五题:
Object.prototype 对象也有proto属性,但它比较特殊,为 null 。因为 null 处于原型链的顶端,这个只能记住。
Object.prototype.__proto__ === null

「JavaScript 高度なプログラミング」の図 6-1

🎜 上記の接続図によれば、次のものが得られます。 🎜rrreee🎜ただし、明確にしておくべき本当に重要なことは、この接続はインスタンス (person1) とプロトタイプ オブジェクト (person.prototype) の間に存在するということです。インスタンス (person1) とコンストラクター (person) の間ではなく、 🎜🎜注: ほとんどのブラウザーは __proto__ 属性をサポートしているため、これは ES6 に追加されました (一部の ES5 ブラウザーもサポートしていますが、まだ標準ではありません)。 🎜🎜2. コンストラクター🎜🎜 Javascript に詳しい人なら誰でも、次のようなオブジェクトを作成できることを知っています:
🎜rrreee🎜これは次と同等です:
🎜rrreee🎜obj はコンストラクター (オブジェクト) ) インスタンス。つまり、
🎜rrreee🎜 新しいオブジェクト obj は、new 演算子の後にコンストラクターを使用して作成されます。コンストラクター (Object) 自体は関数 (前述の関数オブジェクト) であり、上記のコンストラクター person と同様です。この関数は新しいオブジェクトを作成する目的で定義されているというだけです。したがって、Object に怯える必要はありません。 🎜
🎜同様に、オブジェクトを作成できるコンストラクターはObjectだけでなく、Array、Date、Functionなどもあります。
したがって、コンストラクターを使用して配列、日付、関数を作成することもできます🎜rrreee🎜これらのコンストラクターは関数オブジェクトです:🎜

🎜

関数オブジェクト🎜🎜3. プロトタイプチェーン🎜🎜小さなテストが予定されていますチェックあなたの理解: 🎜

  1. 🎜person1.__proto__ とは何ですか? 🎜
  2. 🎜person.__proto__ それは何ですか? 🎜
  3. 🎜person.prototype.__proto__ それは何ですか? 🎜
  4. 🎜Object.__proto__ とは何ですか? 🎜
  5. 🎜Object.prototype__proto__ とは何ですか? 🎜
🎜答え:
最初の質問:
なぜならperson1.__proto__ ===constructor.prototype of person1
なぜなら person1 のコンストラクター === person
つまり、person1.__proto__ === person.prototype🎜🎜 2 番目の質問:
なぜなら、person .__proto__ == = 人のコンストラクター .prototype
人のコンストラクター === 関数
なので、 person.__proto__ === 関数 .prototype です🎜🎜質問 3:
person.prototype は通常のオブジェクトであることを覚えていれば、そのプロパティに注意を払う必要はありません。
通常のオブジェクトのコンストラクター === Object
つまり、 person.prototype.__proto__ === Object.prototype です🎜🎜 4 番目の質問については、2 番目の質問を参照してください。なぜなら、 Person と Object はどちらもコンストラクターだからです🎜🎜 質問 5:
Object.prototype オブジェクトにも proto 属性がありますが、これは特殊であり、null です。 null はプロトタイプ チェーンの先頭にあるため、これは記憶することしかできません。
Object.prototype.__proto__ === null🎜

以上がJS プロトタイプとプロトタイプ チェーンの最も詳細な紹介の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート