JavaScriptを(A)のプロトタイプとプロトタイプチェーンテーマの基礎

コンストラクタは、オブジェクトを作成します

function Person(){

}
let person1 = new Person()
let person2 = new Person()
person1.name = 'james'
person2.name = 'kobe'

复制代码

さんが新しいを通じて人のインスタンスを作成してみましょう、私たちは、異なるインスタンスは、独自の属性を持って見ることができます。

プロト

私たちは、それぞれのことを見ることができる对象場合は、__proto__プロパティを持っていますが、このプロパティは、オブジェクトのプロトタイプを指します

function Person(){

}
Person.prototype.name = 'chris'
let person = new Person()
let person1 = new Person()
let person2 = new Person()

person1.name = 'james'
person2.name = 'kobe'
复制代码

私たちが見る __proto__ 次のプロトタイプが属性に名前を付けるだろうし、 それが何であるとの間の関係? __proto__ prototype

プロトタイプ

それぞれが函数持っているprototype私たちは頻繁に使用されるプロパティをprototype

Person.prototype.name = 'chris'
复制代码

そこで問題は、エンドポイントでのこの関数のprototypeプロパティは何ですか?この関数のプロトタイプは何ですか?実際には、プロトタイプは、それはコンストラクタ作成したインスタンスを呼び出している関数オブジェクトのプロトタイプ属性ポイント、この例のPERSON1とのPERSON2でプロトタイプがあります。

それはプロトタイプということは何ですか?理解することができる:(ヌルを除く)すべてのJavaScriptのオブジェクトはそれが作成され、別のオブジェクトに関連付けされ、このオブジェクトは、我々はプロトタイプを呼んで、各オブジェクトは、呼び出されたプロトタイプからプロパティを継承します。

図:

例によって__proto__コンストラクタのprototypeコントラスト、私たちは人とPerson.prototypeとの関係がわかり

person.__proto__ === Person.prototype  //true
复制代码

図:

そのコンストラクタまたはインスタンスへプロトタイププロパティポイントが存在する場合にインスタンスオブジェクトとコンストラクタので、プロトタイプを指すことができますか?

constructor

見つけるのは難しいことではない、それぞれのコンストラクターがありconstructor、このプロパティを、私たちは、コンソール見つけるconstructor属性ポイントに関連するコンストラクタを

私たちは、コンストラクタ、インスタンスのプロトタイプ、および例との間の関係を理解するように、我々は例やプロトタイプの関係について話します:

プロトタイプの例の下で

私たちは、プロパティはインスタンスを読み取ることができない場合は、オブジェクトの属性に関連したプロトタイプを見つけることを知って、まだ見つける場合は、プロトタイプをプロトタイプに行きました、これまでにトップレベルを発見されました。

function Person() {

}

Person.prototype.name = 'chris';

var person = new Person();

person.name = 'james';
console.log(person.name) // james 拿到实例的name属性

delete person.name;
console.log(person.name) // chris 拿到原型的name属性
复制代码

しかし、どのような場合は、それを読んでいませんか?それはどのような次のプロトタイプのプロトタイプですか?

プロトタイプのプロトタイプの下で

私たちは知識によって上記のことを知っているperson.__proto__Person.protype等しく、その後、Person.prototype.__proto__次の、それは何ですか?これは、オブジェクトインスタンスことは明らかです__proto__

function Person(){}
let person = new Person()
let obj = new Object()
Person.prototype.__proto__ === obj.__proto__//true
Person.prototype.__proto__ === Object.prototype//true
obj.__proto__.__proto__ //null
复制代码

let obj = new Object();
obj.__proto__.name = 'chris'
obj.name = 'Kevin'
console.log(obj.name) // Kevin
delete obj.name
console.log(obj.name) // chris
复制代码

プロトタイプチェーン

今、私たちは知っているObjectこと、プロトタイプをObject.prototype試作品には?

我々はリターンを見ることができ null 、何の表現はプロトタイプではありませんでした。

最終的には、プロトタイプとプロトタイプチェーンです

いくつかのサプリメント

  1. 上のFuntionプロトタイプ我々は見つけることができますFunction.prototypeいくつかの特別なを
Function.prototype === Function.__proto__  //true
复制代码

プロトタイプとプロトタイププロトタイプ、それは一例に見える、すなわち、卵は鶏で、同じです。私たちは、上のMDNを参照することができます__proto__解釈:

__proto__リーダー(ゲッター)は、オブジェクトの内部を露出させます  [[Prototype]] 。オブジェクトリテラル作成されたオブジェクトの場合、値です  Object.prototype作成されたオブジェクトの配列リテラルの場合、この値はあります  Array.prototype関数については、値ですFunction.prototype一つはJS(が提供する楽しいコンストラクタ関数に構築されている、請求作成楽しい新しいオブジェクトの場合、Array、  Boolean、  Date、  Number、  Object、  String など)を、この値は常にfun.prototypeです。作成された定義されている他のjs JSを持つオブジェクトのコンストラクタ関数の場合、この属性の値は、コンストラクタ関数のプロトタイプです。

Object.__proto__ === Function.prototype//true
Object.__proto__ === Function.__proto__ //true
复制代码

引用符で囲まれた胡湯の理解

なぜに関してはFunction.__proto__ === Function.prototypeまず、他の機能との整合性、および秒を維持するために、唯一の関係を示しています、私は2つの可能性があると思います。簡単に言えば、最初がありFunction、その後、試作品に達成するために指しFunction.prototypeますが、我々として逆さまに推測することはできませんFunction.__proto__ === Function.prototypeので、Function自分の世代を呼び出します。

概要

  1. オブジェクトのインスタンスは__proto__常に、コンストラクタを指しますprototype

  2. 唯一のコンストラクタはのみましたprototype(ヌルを除く)のプロパティ、オブジェクトが持つ__proto__プロパティを

  3. 各プロトタイプオブジェクトがありconstructor、そのコンストラクタを指すプロパティを

  4. 属性を読み取るには、読み取り属性の最初のインスタンスは、読書はプロトタイプチェーン上の適切なプロパティを見つけることができません

  5. プロトタイプによる鎖は__proto__、標的に向けられます

  6. プロトタイプチェーンの終わりが常にありますnull

  7. コンストラクタがインスタンス化された後、コンストラクタは両方とも、オブジェクトであります

function Foo() {

}

const obj = new Foo()


Foo.prototype === obj.__proto__ //true
obj.constructor === Foo //true
Foo.prototype.__proto__ === Object.prototype //true
Object.prototype.__proto__ === null //true
Object.constructor === Function  //true
复制代码

JavaScriptの基礎シリーズ

JavaScriptの基礎シリーズカタログ住所:

JavaScriptを(A)のプロトタイプとプロトタイプチェーンテーマの基礎

実行コンテキストおよび実行スタックのJavaScript(II)の基本的なテーマ

初心者書き込み、そこにエラーであるか厳格ではない、と訂正を与えるために皆に言わせれば。この記事はあなたを助けるか、鼓舞してきた場合は、賞賛を与えてください、この中に激励の作者は感謝しました。

ます。https://juejin.im/post/5d0606286fb9a07ecb0ba713で再現

おすすめ

転載: blog.csdn.net/weixin_34259159/article/details/93177141