JavaScriptのnew操作及び_u uプロト.ptototypeと詳しく説明します
3457 ワード
昨日大牛のこのアナログbind関数の実現に関する文章を見て、大いに啓発されました.その中の一つは、bind方法についての戻りの関数を構成関数として扱う問題に関して、私は全く理解できない.そこで基礎を補い、構造関数とnew操作とは一体何かを探究することにした.
The new Operator
まずMDNをめくりました.New操作について詳しく説明します.簡単にいくつかの比較的重要な情報をとります.
When the code new Foo(...)is executed,the follwing things happen: A new object is created,inhering from Foo.prototype The constructor function Foo is caled with the specified argments,and with this bound to the newly created oject. コードで下記を表します.
プロトタイプ コンストラクションのプロパティ は、 を含む.
誰が すべての非原生関数と元の構成関数
対象に向かうことを愛する友達はきっと以下のコードをよく知っています.
[プロト] プロトタイプチェーンの一つのプロトタイプ 誰が Objectは全部あります.(nullを除く)
The new Operator
まずMDNをめくりました.New操作について詳しく説明します.簡単にいくつかの比較的重要な情報をとります.
When the code new Foo(...)is executed,the follwing things happen:
// var foo = new Foo('foo')
// A new object is created
var foo = {}
// inheriting from Foo.prototype
foo.__proto__ = Foo.prototype
// The constructor function Foo is called with the specified arguments, and with this bound to the newly created object.
Foo.call(foo, 'foo')
なぜfoo.__proto__ = Foo.prototype
なのかをよりよく理解するためには、__proto__
とprototype
との関係をより深く探求する必要があります.プロトタイプ
prototype
は何ですか?constructor
フィールドのObject prototype
がありますか?// , prototype
var nativeFunction = Function.prototype.call
console.log(nativeFunction.__proto__) // function () {}
console.log(nativeFunction.prototype) // undefined
new nativeFunction() // Uncaught TypeError: nativeFunction is not a constructor
prototype
は、構造関数ならではの属性であり、その「原型」と呼ばれていますが、実はかなり不謹慎で、深刻な誤解があると言われています.prototype
本質はJavaScriptという言語が開発者の操作モデルとして外部に暴露されるインターフェースである.開発者のprototype
に対する操作は、最終的には、この構造関数の例の__proto__
に反映される.対象に向かうことを愛する友達はきっと以下のコードをよく知っています.
var Foo = function () {}
Foo.prototype = {
constructor: Foo,
// ...
}
var foo = new Foo()
Foo.prototype
を書き換えました.全部手動でconstructor
を追加しなければなりません.そうでなければ、インスタンスのプロトタイプfoo.__proto__
はconstructor
に見つからないだろう.[プロト]
__proto__
は何ですか?__proto__
がありますか?var Foo = function () {}
var foo = new Foo()
// Foo => function () {} => Object {} => null
console.log(Foo.__proto__) // function () {}
console.log(Foo.__proto__.__proto__) // Object {} | Object
console.log(Foo.__proto__.__proto__.__proto__) // null | ?typeof null === Object
// foo => { constructor: (...), __proto__: (...) } => Object {} => null
console.log(foo.__proto__) // { constructor, __proto__,... } | Foo prototype
console.log(foo.__proto__.__proto__) // Object {}
console.log(foo.__proto__.__proto__.__proto__) // null
締め括りをつけるprototype
は、開発者がこのようにインスタンスのプロトタイプを定義することができるという意味であり、これもJavaScript
のオブジェクト指向の基礎である.__proto__
はプロトタイプの次元で一列になり、JavaScript
の強力なプロトタイプシステムを構築し、prototype
とは別のレベルの概念である.どうしても二人の関係を話したいなら、大丈夫と言ってもいいと思います.//
Foo.prototype.constructor => Foo
Foo.prototype.constructor.prototype.constructor => Foo
Foo.prototype.constructor.prototype.constructor.prototype.constructor => Foo
Foo.prototype.constructor.prototype.constructor.prototype.constructor.prototype.constructor => Foo
// ...