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.
  • コードで下記を表します.
    //   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__がありますか?
  • Objectは全部あります.(nullを除く)
  • 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
    //     ...