## 新旧对比 在准备课程的这个时间 https://github.com/madrobby/zepto/blob/master/src/zepto.js#files 其中的代码中,`zepto.Z`是这样实现的: ```js function Z(dom, selector) { var i, len = dom ? dom.length : 0 for (i = 0; i < len; i++) this[i] = dom[i] this.length = len this.selector = selector || '' } // `$.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. This method can be overridden in plugins. zepto.Z = function(dom, selector) { return new Z(dom, selector) } $.fn = { // ...很多属性... } zepto.Z.prototype = Z.prototype = $.fn ``` 再把之前的拿出来对比一下 ```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 } $.fn = { // ...很多属性... } ``` <br> ## 两者的异同 第二种实现方式我们已经讲完了,最终它返回的一个数组,并且强制将`__proto__`修改为`$.fn`这个对象。这个修改发生在对象上,修改的隐式原型。 ![](https://box.kancloud.cn/2016-07-04_577a764d9fab9.png) 而第一种实现方式,是直接将构造函数的原型修改了,即 `Z.prototype = $.fn`,经过这样一改,构造函数再`new`出来的对象的隐式原型`__proto__`自然就指向了`$.fn`。 ![](https://box.kancloud.cn/2016-07-04_577a764dc04f6.png) 另外,第一种方式返回的是一个`对象数组`,而第二种返回的是一个数组。何谓对象数组?——即可以模拟进行数组操作的对象。 ```js var objArray = { 0: 'abc', 1: 'bcd', 2: 'cde', length: 3 }; console.log( objArray[1] ) console.log( objArray.length ) ``` 那为何不用数组,而用对象数组?——对象本质上更加灵活、直观,例如 ```js objArray.selector = ''; ```