<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                > * js里所有的對象都有**proto**屬性(對象,函數),指向構造該對象的構造函數的原型。 > * 只有函數function才具有prototype屬性。這個屬性是一個指針,指向一個對象,這個對象的用途就是包含所有實例共享的屬性和方法(我們把這個對象叫做原型對象)。原型對象也有一個屬性,叫做constructor,這個屬性包含了一個指針,指回原構造函數。 要理解原型和原型鏈首先要知道幾個概念: ①、在js里,繼承機制是原型繼承。繼承的起點是 對象的原型(Object prototype)。 ②、一切皆為對象,只要是對象,就會有 proto 屬性,該屬性存儲了指向其構造的指針。 Object prototype也是對象,其 proto 指向null。 ③、對象分為兩種:函數對象和普通對象,只有函數對象擁有『原型』對象(prototype)。 prototype的本質是普通對象。 Function prototype比較特殊,是沒有prototype的函數對象。 new操作得到的對象是普通對象。 ④、當調取一個對象的屬性時,會先在本身查找,若無,就根據 proto 找到構造原型,若無,繼續往上找。最后會到達頂層Object prototype,它的 proto 指向null,均無結果則返回undefined,結束。 ⑤、由 proto 串起的路徑就是『原型鏈』。 ### 三句話總結原型和原型鏈 > 第一句話:`prototype`是函數的原型對象,即`prototype`是一個對象,它會被對應的`__proto__`引用。 > 第二句話:要知道自己的`__proto__`引用了哪個`prototype`,只需要看看是哪個構造函數構造了你,那你的`__proto__`就是那個構造函數的`prototype`。 > 第三句話:所有的構造函數的原型鏈最后都會引用`Object`構造函數的原型,即可以理解Object構造函數的原型是所有原型鏈的最底層,即`Object.prototype.__proto===null` **以下試題幫助您加深理解** ## 第一道: ~~~ Object.__proto__ === ????填空???? // 為 true ~~~ ????求`Object.__proto__`,首先你要知道`Object`是什么數據類型,他是一個構造函數,也就是一個函數,來復習一下我們的第二句話,函數由哪個構造函數構造出來?那不是廢話嗎,當然是`Function`,因此很明顯,答案就是: ~~~ Object.__proto__ === Function.prototype // 為 true ~~~ ## 第二道: ~~~ Function.__proto__ === ????填空???? // 為 true ~~~ ????求`Function.__proto__`,一樣,你要先清楚`Function`是什么數據類型,他同樣是一個構造函數,是來用來創建(構造)一個函數的構造函數(- -!有點拗口),所以同樣的,用我們的第二句話即可解決,這個構造函數同樣是函數,因此答案就是: ~~~ Function.__proto__ === Function.prototype // 為 true ~~~ ## 第三道: ~~~ true.__proto__ === ????填空???? // 為 true ~~~ ????求`true.__proto__`,有沒有感覺是換湯不換藥,`true`是什么數據類型,`Boolean`嘛,因此它是由構造函數`Boolean`構造出來的,所以答案顯而易見: ~~~ true.__proto__ === Boolean.prototype // 為 true ~~~ ## 第四道: ~~~ Function.prototype.__proto__ === ????填空???? // 為 true ~~~ ????求`Function.prototype.__proto__`,好了,這里需要第一句話和第二句話一起用了,首先根據第一句話,`prototype`是一個對象,然后根據第二句話,那么既然它是一個對象,他的構造函數很明顯就是`Object`,因此答案也呼之欲出了: ~~~ Function.prototype.__proto__ ===Object.prototype // 為 true ~~~ ## 第五道: ~~~ function Test(){} var test=new Test() test.__proto__===????填空???? // 為 true ~~~ ????對于自己寫的構造函數,這三句話依然有效,因此答案也很容易就得出來了: ~~~ test.__proto__===Test.prototype // 為 true ~~~ ## 最后一道,必須謹記的例外: ~~~ Object.prototype.__proto__===null ~~~
                  <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>

                              哎呀哎呀视频在线观看