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

                ??一站式輕松地調用各大LLM模型接口,支持GPT4、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                #繼承的其他形式之類式繼承 ![](https://box.kancloud.cn/f8130f43d77df9461ac4014b72221be6_857x391.png) 類:JS是沒有類的概念的,在JS中可以把構造函數看做是類 ``` function Aaa(){ // 父類 this.name = '小明'; } Aaa.prototype.showName = function(){ alert(this.name); }; function Bbb(){ // 子類 } Bbb.prototype = new Aaa(); // 這一句話就是類式繼承 var b1 = new Bbb(); b1.showName(); // 小明 alert(b1.name); // 小明 ``` b1調用showName方法的過程:它會先從b1開始找,由于b1本身并沒有showName方法,因此它會通過原型鏈找到Bbb.prototype繼而找到a1,a1下面也沒有showName方法,于是a1又會通過原型鏈找到Aaa.prototype就能找到showName方法了。同理:alert(b1.name)也能彈出小明。不過這種寫法還有很多問題 ![](https://box.kancloud.cn/8db8bd3513e1df6690ee35b519b9275f_1437x808.png) 問題一:constructor指向問題 ``` function Aaa(){ // 父類 this.name = '小明'; } Aaa.prototype.showName = function(){ alert(this.name); }; function Bbb(){ // 子類 } Bbb.prototype = new Aaa(); // 這一句話就是類式繼承 var b1 = new Bbb(); alert(b1.constructor); ``` 打印出來的結果是 ``` function Aaa(){ // 父類 this.name = '小明'; } ``` 這就說明Bbb的constructor指向被修改了,解決如下: ``` function Aaa(){ // 父類 this.name = '小明'; } Aaa.prototype.showName = function(){ alert(this.name); }; function Bbb(){ // 子類 } Bbb.prototype = new Aaa(); // 這一句話就是類式繼承 Bbb.prototype.constructor = Bbb; // 修正 constructor 指向 var b1 = new Bbb(); alert(b1.constructor); ``` 問題二:多個對象之間屬性會相互影響 ``` function Aaa() { // 父類 this.name = [1, 2, 3]; } Aaa.prototype.showName = function () { alert(this.name); }; function Bbb() { // 子類 } Bbb.prototype = new Aaa(); // 這一句話就是類式繼承 Bbb.prototype.constructor = Bbb; // 修正 constructor 指向 var b1 = new Bbb(); b1.name.push(4); var b2 = new Bbb(); alert(b2.name); // 1,2,3,4 ``` 解決方法:屬性和方法繼承的時候要分開繼承 ![](https://box.kancloud.cn/b74394ccc92c550d9fff5cb5e048d8da_1438x807.png) ``` function Aaa() { // 父類 this.name = [1, 2, 3]; } Aaa.prototype.showName = function () { alert(this.name); }; function Bbb() { // 子類 } // 繼承方法 var F = function(){}; F.prototype = Aaa.prototype; Bbb.prototype = new F(); // 這一句話就是類式繼承 Bbb.prototype.constructor = Bbb; // 修正 constructor 指向 var b1 = new Bbb(); var b2 = new Bbb(); alert(b2.name); // undefined ``` 通過上面可以看出通過b2去找name屬性是找不到的,因為只繼承了方法,最終解決方法如下: ``` function Aaa() { // 父類 this.name = [1, 2, 3]; } Aaa.prototype.showName = function () { alert(this.name); }; function Bbb() { // 子類 // 繼承屬性 Aaa.call(this); } // 繼承方法 var F = function(){}; F.prototype = Aaa.prototype; Bbb.prototype = new F(); // 這一句話就是類式繼承 Bbb.prototype.constructor = Bbb; // 修正 constructor 指向 var b1 = new Bbb(); b1.name.push(4); var b2 = new Bbb(); alert(b2.name); // 1,2,3 ```
                  <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>

                              哎呀哎呀视频在线观看