<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、智譜、豆包、星火、月之暗面及文生圖、文生視頻 廣告
                ## javascript 三座大山 這個標題其實我自己總結的,目前網絡上沒有相關的說法。意思就是javascript中比較重要難懂的三點知識。熟練掌握了這三點,你的javascript的基本功才算是過關。否則,你去BAT這種公司去面試前端,估計是過不了關。 - **原型和原型鏈** - **上下文環境和作用域** - **單線程和異步** 以上這『三座大山』我希望能找機會跟大家單獨分享,此處只講第一個的一部分,即講到你能看懂后面zepto的設計,就夠了。 <br> ## `Array.prototype` 先記住一句話——**每一個函數,都有一個`prototype`屬性**——每一個函數,無論是你自定義的,還是系統內置的。不信可以試試。 ```js var fn = function() {} console.log( fn.prototype ); ``` 這里打印出來的`fn.prototype`是一個對象,只有一個`constructor`屬性,指向該函數自身,即`fn.prototype.constructor === fn`。 ![](https://box.kancloud.cn/2016-07-04_577a764cd4521.png) 以上是自定義的函數,數組構造函數`Array`也是一個函數,只不過是瀏覽器內置的函數,它也得符合以上那句話。 ```js console.log( typeof Array ); // 'function' console.log( Array.prototype ); ``` 這里打印出來的`Array.prototype`也是一個對象,也有一個`constructor`屬性,指向該函數自身。只不過還內置了其他的屬性——廢話,內置的對象毛用沒有還內置個卵勁啊。 ![](https://box.kancloud.cn/2016-07-04_577a764d259d6.png) <br> ## `[].__proto__` 然后,再記住一句話——**所有通過函數`new`出來的東西,這個東西都有一個`__proto__`指向這個函數的`prototype`**,這里我們給他們分別取一個中文名字: - `prototype` (顯示)原型 - `__proto__` 隱式原型 ```js var arr = []; // 等價于 var arr = new Array() arr.__proto__ === Array.prototype; // true ``` ![](https://box.kancloud.cn/2016-07-04_577a764d3a167.png) 然后,再記住一句話——**當你想要使用一個對象(或者一個數組)的某個功能時:如果該對象本身具有這個功能,則直接使用;如果該對象本身沒有這個功能,則去`__proto__`中找** ```js var obj = { fn1: function () { console.log('fn1'); } }; obj.fn1(); // 'fn1' obj.toString(); // '[object Object]' (在 obj.__proto__ 中找到) ``` 數組也一樣 ```js var arr = []; arr.push(1); // 在 arr.__proto__ 中找到了 push 方法 ``` 這就是為何數組會有`concat`、`push`等方法,順藤摸瓜最終摸到了`Array.prototype`中來了。 因此,下列代碼是成立的 ```js [].concat === Array.prototype.concat; [].push === Array.prototype.push; [].map === Array.prototype.map; ``` <br> ## `__proto__`是可修改的 上一節我們說過,`__proto__`就是一個基本的js對象,根據js無底線的語法規則,它是完全可以被修改或者重寫的。這里不妨就再多嘮叨兩句。 ![](https://box.kancloud.cn/2016-07-04_577a764d558af.png) 修改`__proto__`的例子。修改了之后,`arr`不僅有內置的`concat`、`push`等功能,還多了一個`addClass`功能。 ```js var arr = [1,2,3]; arr.__proto__.addClass = function () { console.log(123); } arr.push(4); arr.addClass(); // 123 ``` 完全重寫 `__proto__` 的例子,上一節講過。還是注意,重寫`__proto__`之后,`arr`可就失去了`concat`、`push`等親人了,只有一個`addClass`功能了。 ```js var arr = [1,2,3]; arr.__proto__ = { addClass: function () { console.log(123); } }; arr.addClass(); // 123 ``` <br> ## 總結 第一,上文中有三句話要記住并且理解; 第二,有了這些基礎知識,再去扒zepto的皮就輕而易舉了; 第三,關于js的原型和原型鏈的知識,真的還有很多話沒有說; <br>
                  <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>

                              哎呀哎呀视频在线观看