`
haiyupeter
  • 浏览: 426140 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

jQuery链式操作实现原理 (Array-Like Object)

阅读更多
jQuery链式代码风格:jQuery(“#one_div”).html(“something”).on(“click”, function(){}).find(“p”); 的实现原理解析。

1.通过数组方式支持连写
JavaScript 可以设计用起来像 Array 的对象:
var arr = ['ab', 'ac', 'add'];
arr.replace = function ( c, v ) {
    for (var i = 0; i < this.length; i++) {
        this[i] = this[i].replace(c, v);
    }
    return this;
}
 
arr.add = function(v) {
    for ( var i = 0; i < this.length; i++ ) {
        this[i] = this[i] + v;
    }
    return this;
}
var b = arr.replace('a', 't-').add('-add');


    往 Array 对象里面添加方法,每个方法返回当前对象,使链式操作完成。使用 Object.prototype.toString.call(b) 结果为 [object Array] 对象,说明b是一个数组对象,b对象包含了 Array 原生 slice 和 join 等方法,污染了最终对象。
在firebug中b对象的打印如下:



2.通过Array-Like Object方式支持链式操作
    在jQuery中,重写对象的 splice 方法,让浏览器误认 jQuery 对象为一个数组,但Object.prototype.toString.call(d)中打出的为[object Object]的信息,使jQuery('div')得到的对象为一个非Array对象

// 最终答案
var c = {};
c[0] = 'ab';
c[1] = 'ac';
c[2] = 'add';
// 模拟数组必需指定length属性,元素增加或者修改时需要同时改变
c.length = 3;
// 此处是重点,使用了数组的splice方法后,才能将该对象模拟成数组
c.splice = [].splice;
c.replace = function ( c, v ) {
    for (var i = 0; i < this.length; i++) {
        this[i] = this[i].replace(c, v);
    }
    return this;
}
 
c.add = function(v) {
    for ( var i = 0; i < this.length; i++ ) {
        this[i] = this[i] + v;
    }
    return this;
}
// 链式操作实现
var d = c.replace('a', 't-').add('-add');

    在firebug打印结果为:



    在控制台中输入d.slice,打印为undefined,说明对象d没有被数组方法污染。
    参考:http://stackoverflow.com/questions/6599071/array-like-objects-in-javascript
  • 大小: 23.8 KB
  • 大小: 28 KB
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics