<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                ThinkChat2.0新版上線,更智能更精彩,支持會話、畫圖、視頻、閱讀、搜索等,送10W Token,即刻開啟你的AI之旅 廣告
                >[success] # 思想上 利用工廠函數創建對象,因此可以發現下面手動實現一個new ,其中new 很像一個構造函數語法糖 ~~~ function createPerson(name,age){ const per = {} per.name = name per.age =age return per } const p1 = createPerson('w',15) const p2 = createPerson('ww',155) ~~~ >[success] # 手動實現一個new ~~~ 1.創建一個新對象; 2.將構造函數的作用域賦給新對象(因此 this 就指向了這個新對象); 3.執行構造函數中的代碼(為這個新對象添加屬性); 4.返回新對象。 ~~~ >[danger] ##### 跟著分析來看 ~~~ 分析下面這段代碼new 做了什么 function F(init) {} var f = new F(args) 1.創建一個臨時的空對象,為了表述方便,我們命名為 fn,讓對象 fn 的隱式原型指向函數 F 的顯式原型; 2.執行函數 F(),將 this 指向對象 fn,并傳入參數 args,得到執行結果 result; 3.判斷上一步的執行結果 result,如果 result 為非空對象,則返回 result,否則返回 fn。 var fn = Object.create(F.prototype) var obj = F.apply(fn, args) var f = obj && typeof obj === 'object' ? obj : fn; ~~~ >[danger] ##### 手動實現一個new [知識點參考文章,不過本文章有的是數組的截取方法 ](https://www.jianshu.com/p/f76011a705f6) ~~~ 1.根據上面的知: 1.1.首先需要一個空對象,這里采用的是通過'new Object()'創建, 1.2.改變我們創建新對象的原型指向,也是就改變'__proto__',默認是指向'Object',將這個指向改變成 我們想使用的構造函數的原型 1.3.將這個構造函數的this指向變成我們創建的'對象' 2.知識點:[].shift.call( arguments ) -- 首先arguments 是數組,這個寫法就會把 數組指向了 arguments 并且取出他的第一項,他的第一項也是就當前的構造函數 ~~~ ~~~ function Person( name ){ this.name = name; }; Person.prototype.getName = function(){ return this.name; }; var objectFactory = function(){ // 創建一個 空對象 var obj = new Object(); // 獲取構造函數 var Constructor = [].shift.call( arguments ) // 改變當前obj 空對象原型鏈的指向 obj.__proto__ = Constructor.prototype // 改變構造函數指向 var ret = Constructor.apply( obj, arguments ); return typeof ret === 'object' ? ret : obj; // 確保構造器總是會返回一個對象 } // 這個寫法等同 console.log(new Person('wang')) var a = objectFactory( Person, 'sven' ); console.log(a) console.log( a.name ); // 輸出:sven console.log( a.getName() ); // 輸出:sven console.log( Object.getPrototypeOf( a ) === Person.prototype ); ~~~ >[danger] ##### 解答疑惑 ~~~ 1.return typeof ret === 'object' ? ret : obj; // 確保構造器總是會返回一個對象 真的是這種簡單的考慮么? 真正的原因new 關鍵詞執行之后總是會返回一個對象,要么是實例對象,要么是 return 語句指定的對象。 2.也就是定義的構造函數如果內部 return 是一個對象那么就需要返回是構造函數返回的對象 ~~~ * 當構造函數有返回值的時候 ~~~ 1.當構造函數最后 return 出來的是一個和 this 無關的對象時,new 命令會直接返回這個新對象, 而不是通過 new 執行步驟生成的 this 對象 ~~~ ~~~ function Person(){ this.name = 'Jack'; return {age: 18} } var p = new Person(); console.log(p) // {age: 18} console.log(p.name) // undefined console.log(p.age) // 18 ~~~ * 當返回時候是非對象 ~~~ 1.構造函數中 return 的不是一個對象時,那么它還是會根據 new 關鍵詞的執行邏輯, 生成一個新的對象(綁定了最新 this),最后返回出來 ~~~ ~~~ function Person(){ this.name = 'Jack'; return 'tom'; } var p = new Person(); console.log(p) // {name: 'Jack'} console.log(p.name) // Jack ~~~
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看