オブジェクトと関数にコードの一部に起因する鶏と卵の問題を考えます

フロントエンドの開発者として、我々はすべてのJSがトップのObject.prototypeプロトタイプチェーンは、すべてのオブジェクトがのtoString()、のvalueOfを(継承)とそれから公共の財産に含まれている単一継承、であることを知っています。

鶏と卵の問題の起源

まず、ObjectおよびFunctionコンストラクタおよびコンストラクタはすべてされているFunctionオブジェクトの例。だから、ObjectあるFunctionオブジェクトのインスタンスは、とFunction.prototypeあるObjectオブジェクトのインスタンス。だからここに鶏と卵の興味深い帰結質問です:

Object instanceof Function  // true
Function instanceof Object  // true

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

まあObjectFunctionそれである鶏の卵は誰ですか?

そして、上の鶏の問題によって引き起こされる上記のコードの下に鶏の卵を詳細に調べるために、これは次のプロトタイプ/プロトタイプチェーン古典的なマップ、このプロセスの深い理解から始まるObject.prototypeFunction.prototypefunction Object()function Function()このプロセスの間の関係少し焼け脳であってもよいし、結局、大きなものJSの形而上学です。

Object.prototype

プロトタイプチェーンの端があるObject.prototype(に関係なくnullの場合)。すべてのオブジェクトはからあるObject.prototypeようにパブリックプロパティ継承されたtoString()メソッドと

Object.prototypeそれは表してObject、実際には、プロトタイプオブジェクトをObject.prototypeしないことによってObject作成機能、なぜ?次のコードを見てください:

function Dog() {
  this.name = '川普';
}
var dog = new Dog();
dog.__proto__ === Dog.prototype;  // true
复制代码

オブジェクトの例としては、__proto__コンストラクタを指すようになります指すが、再び、それはあるを通じてない、それが生産されたか、作成した関数?実際には、ECMAScript仕様の作成の基礎となるオブジェクトに応じてブラウザが、これだけの内側の古典的なビューを見てはない、本当に、創造の機能。prototypedog.__proto__Dog.prototypeObject.prototype.__proto__nullObject.prototypeObjectObject.prototypeObject.prototypeObject

Function.prototype

Function.prototypeそしてFunction.__proto__ため、同じオブジェクト

:これも意味Object/ Arrayなどの構造と機能には、本質的にFunction同じ、継承されているFunction.prototype古典的なマップビューから経由でnew Functionアウト構造

もちろん、Function.prototypeオブジェクトは、関数(オブジェクト)、ある__proto__ポイント属性Object.prototype、即ちFunction.prototype直接ルートを継承しましたObject.prototype)(。

この時点することにより、我々は把握することができます継承されたプロトタイプチェーンをFunction|Object|Array...--->Function.prototype--->Object.prototype(root)下図のように:

関数オブジェクト()

Objectコンストラクタとそのよう__proto__属性ポイントFunction.prototype、すなわち:

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

古典的なマップビューから:

使用new Object()作成インスタンスO1オブジェクトと、オブジェクトインスタンスのO1は__proto__点コンストラクタ属性prototypeがある図形を対応する属性のObject.prototypeことo1.__proto__ === Object.prototype結果ですtrue

Function.prototypeオブジェクトを指し、それは__proto__を指すようになりますObject.prototypeので、Function.prototypeオブジェクトも共通であるために指されObjectたオブジェクトの作成、それは基本的なルールに従います。

ファンクション機能()

Functionまた、関数オブジェクトが、またある__proto__、それが関数であるから、されている必要があり、プロパティFunctionには、作成したFunction自己作成したので、それはだ__proto__、自身を指していますPrototype

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

ここで少し脳がそれを燃やす、我々は鶏と卵の問題を見てください。

ファンクション&オブジェクト鶏と卵の問題

上記から明らかなように、Objectコンストラクタは継承しFunction.prototypeながら、Functionコンストラクタは継承されObject.prototype、そこに生じた鶏と卵の問題が。なぜ、このような問題があるのでしょうか?私たちは、最初に、より深いレベルで理解する必要がありFunction.prototype、それが原因であるため、このオブジェクトFunction instanceof ObjectObject instanceof Functionしているtrue理由。

// Object instanceof Function 	即
Object.__proto__ === Function.prototype   // true

// Function instanceof Object 	即
Function.__proto__.__proto__ === Object.prototype   // true

// Object instanceof Object 		即 			
Object.__proto__.__proto__ === Object.prototype   // true

// Function instanceof Function 即	
Function.__proto__ === Function.prototype   // true
复制代码

JS仕様、Function.prototypeしかし一般的な機能(目的)関数(オブジェクト)とは異なる、前記

  1. Function.prototype通常の関数のように呼ばれるが、常に返すことができますundefined
  2. 正常な機能は、実際にFunction継承されている正常な機能のインスタンスFunction.prototypeすなわちfunc.__proto__ === Function.prototype
  3. Function.prototype継承Object.prototypeではなく、prototypeプロパティを。
  4. だから、Function.prototype実際には、機能の異なるタイプがあり、それは/前の独立することができFunction、生産。

そしてObject自体(構造)関数であり、あるFunction例、即ち、Object.__proto__それがありますFunction.prototype

概要:前Object.prototype(先頭にプロトタイプチェーン)、Function.prototype連続はObject.prototype最終的には、生成する、FunctionおよびObjectその他の継承されたコンストラクタがFunction.prototype生成されました

私たちはここを参照してくださいの疲れていると思う、それはまだ少し混乱していないのですか?カオスは正常です。その記事が完全に明確な根拠、次の私たちが助けるために別の友人を招待します、との混乱、それを聞かせ、古くからの友人である- 、instanceofそして少し次回分解に聞いてください。

あなたは記事が少しあなたを助けるためと考えられる場合は、に歓迎私のGitHubのブログのポイントの賞賛と注目、非常に感謝!

おすすめ

転載: blog.csdn.net/weixin_34067102/article/details/91398429