只要還能往前走,就先走著,那些岔道回頭再說。只要思路捋順了,那些零碎的問題,都不是問題。
<br>
## `zepto.Z` 函數
上一節了解到`zepto.init`函數中,最終又將數據傳遞給了`zepto.Z`函數。這個函數其實非常簡單,如果你看不懂,可能是忘記之前講過的原型鏈的知識了。
```js
// `$.zepto.Z` swaps out the prototype of the given `dom` array
// of nodes with `$.fn` and thus supplying all the Zepto functions
// to the array. Note that `__proto__` is not supported on Internet
// Explorer. This method can be overriden in plugins.
zepto.Z = function(dom, selector) {
dom = dom || []
dom.__proto__ = $.fn
dom.selector = selector || ''
return dom
}
```
以上代碼中,`dom`是一個數組,并且把它的隱式原型賦值`$.fn`,而這里的`$.fn`其實就是一個普通的js對象(馬上要說),跟我們之前講述js原型鏈的時候一模一樣。
-----
**PS:后來發現,最新的`zepto.Z`實現上目前不一樣,到最后再給大家聊聊這事兒。不過這絲毫不影響其他代碼的講解,請放心**
<br>
## `$.fn`是個什么鬼?
我們在之前的章節說過,`$`是一個函數,即
```js
$ = function(selector, context){
return zepto.init(selector, context)
}
```
而函數也像對象一樣,可以隨便定義屬性賦值的。之前我們說過,每個函數都會有一個內置的`prototype`屬性,這是內置的,我們完全可以自定義一個屬性,這個完全可以的。
```js
$.fn = {
a: 100
};
```
而zepto源碼中,`$.fn`是這樣賦值的,可以去源碼中挨個看看其中的屬性。

我們之前模擬過一個zepto設計的代碼,還記得吧。我們代碼分析到這里,你可以發現,zepto的源碼實現,跟我們之前模擬的一模一樣。
*當然,之前的模擬是我故意那么做的,目的是為了將大家更容易的帶入進來*