<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>

                合規國際互聯網加速 OSASE為企業客戶提供高速穩定SD-WAN國際加速解決方案。 廣告
                繼承,使子類具有父類的方法和屬性 在ES5繼承的實現非常有趣的,由于沒有傳統面向對象類的概念,Javascript利用原型鏈的特性來實現繼承。 原型鏈的特點和實現已經在之前的一篇整理說過了,就是通過將子類構造函數的原型作為父類構造函數的實例,這樣就連通了子類-子類原型-父類,原型鏈的特點就是逐層查找,從子類開始一直往上直到所有對象的原型Object.prototype,找到屬性方法之后就會停止查找,所以下層的屬性方法會覆蓋上層。 一個基本的基于**原型鏈的繼承**過程大概是這樣的: ~~~ //父類構造函數 function Plan(color){ this.color=color; } //父類原型加個方法 Plan.prototype.fly=function(){ console.log('flying'); } //子類 function Fighter(){ this.bullets=[] } Fighter.prototype=new Plan('red') Fighter.prototype.constructor=Fighter; //糾正constructor Fighter.prototype.shoot=function(){ //給子類添加子類特有的方法,注意順序要在繼承之后 console.log('biu biu biu') } var fighter1 = new Fighter() ~~~ 原型鏈實現的繼承主要有幾個問題: 1、**共享**帶來的問題,本來我們為了構造函數屬性的封裝私有性,方法的復用性,提倡將屬性聲明在構造函數內,而將方法綁定在原型對象上,但是現在子類的原型是父類的一個實例,自然父類的屬性就變成子類原型的屬性了; 這就會帶來一個問題,我們知道構造函數的原型屬性在所有構造的實例中是共享的,所以原型中屬性的改變會反應到所有的實例上,這就違背了我們想要屬性私有化的初衷; 2、創建子類的實例時,**不能**向父類的構造函數傳遞**參數** 為了解決以上兩個問題,有一個叫借用構造函數的方法 只需要在子類構造函數內部使用apply或者call來調用父類的函數即可在實現屬性繼承的同時,又能傳遞參數,又能讓實例不互相影響 3.constructor指向問題 結合借用構造函數和原型鏈的方法,可以實現比較完美的繼承方法,可以稱為**組合繼承。** ~~~ //父類構造函數 function Plan(color){ this.color=color; } Plan.prototype.fly=function(){ console.log('flying'); } //子類 function Fighter(color){ Plan.call(this,color); //繼承屬性 this.bullets=[]; } Fighter.prototype=new Plan() //繼承方法 Fighter.prototype.constructor=Fighter; Fighter.prototype.shoot = function(){ console.log('biu biu biu'); } var fighter1 = new Fighter('blue') fighter1.shoot() fighter1.fly() ~~~ 還有一個**最佳實踐**,用一個函數來copy父類的方法 ~~~ //父類構造函數 function Plan(color){ this.color=color; } Plan.prototype.fly=function(){ console.log('flying') } //子類 function Fighter(color){ this.bullets=[]; Plan.call(this,'red') //繼承屬性 } inheritPrototype(Fighter,Plan) //繼承原型上的方法 //聲明inheritPrototype 方法用于繼承原型上的方法 function inheritPrototype(subType,superType){ var protoType=Object.create(superType.prototype); protoType.constructor=subType; subType.prototype=protoType; } var fighter=new Fighter() fighter.fly() ~~~
                  <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>

                              哎呀哎呀视频在线观看