フロントエンドの開発者として、我々はすべての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
复制代码
まあObject
とFunction
それである鶏の卵は誰ですか?
そして、上の鶏の問題によって引き起こされる上記のコードの下に鶏の卵を詳細に調べるために、これは次のプロトタイプ/プロトタイプチェーン古典的なマップ、このプロセスの深い理解から始まるObject.prototype
、Function.prototype
、function 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仕様の作成の基礎となるオブジェクトに応じてブラウザが、これだけの内側の古典的なビューを見てではない、本当に、創造の機能。prototype
dog.__proto__
Dog.prototype
Object.prototype.__proto__
null
Object.prototype
Object
Object.prototype
Object.prototype
Object
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 Object
とObject 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
しかし一般的な機能(目的)関数(オブジェクト)とは異なる、前記
Function.prototype
通常の関数のように呼ばれるが、常に返すことができますundefined
。- 正常な機能は、実際に
Function
継承されている正常な機能のインスタンスFunction.prototype
。すなわちfunc.__proto__ === Function.prototype
。 Function.prototype
継承Object.prototype
ではなく、prototype
プロパティを。- だから、
Function.prototype
実際には、機能の異なるタイプがあり、それは/前の独立することができFunction
、生産。
そしてObject
自体(構造)関数であり、あるFunction
例、即ち、Object.__proto__
それがありますFunction.prototype
。
概要:前Object.prototype
(先頭にプロトタイプチェーン)、Function.prototype
連続はObject.prototype
最終的には、生成する、Function
およびObject
その他の継承されたコンストラクタがFunction.prototype
生成されました。
私たちはここを参照してくださいの疲れていると思う、それはまだ少し混乱していないのですか?カオスは正常です。その記事が完全に明確な根拠、次の私たちが助けるために別の友人を招待します、との混乱、それを聞かせ、古くからの友人である- 、instanceof
そして少し次回分解に聞いてください。
あなたは記事が少しあなたを助けるためと考えられる場合は、に歓迎私のGitHubのブログのポイントの賞賛と注目、非常に感謝!