JavaScript链式调用的设计

作者:karry 来源:cssrain 时间:2009-12-04 12:46:00 

用过jQuery的朋友一定对jQuery中方法的链式调用印象深刻,最近发布的YUI3也支持了方法的链式调用。这是一个非常不错的语法特性,能让代码更加简洁、易读。很多时候链式调用可以避免多次重复使用一个对象变量,从而减少代码,而js是一种客户端执行的脚本语言,减少代码就减少了js文件的大小,减少了服务器的压力。链式调用这么多优点,它是如何实现的呢?这篇文章就是想探讨一下这个问题。

链式调用例子如:$("p").append("test").fadeIn("fast");

看一段jQuery的源码:

append: function() {
        return this.domManip(arguments, true, function(elem){
            if (this.nodeType == 1)
                this.appendChild( elem );
        });
    }

以上是jQuery中append方法的实现。append方法是向每个匹配的元素内部追加内容的方法,很明显,属于赋值操作,但是却有返回值,返回的是当前操作的dom(通常返回this指针)。这是链式调用的关键,你会发现这不过是个语法小技巧而已。

很明显,在赋值器方法中(或者本身没有返回值的方法中)很容易实现链式调用,而取值器相对来说不好实现链式调用,因为你需要取值器返回你需要的数据而不是this指针(当然,如果你坚持要实现链式方法,也可以用回调函数来实现)。

设计一个简单的支持链式调用的类:


function Dog(name,color){
        this.name=name||"";
        this.color=color||"";
}
Dog.prototype.setName=function(name){
        this.name=name;
        return this;
};
Dog.prototype.setColor(color){
        this.color=color;
        return this;
};
Dog.prototype.yelp(){
        alert("我的名字叫:"+this.name+",我的颜色是:"+this.color);
        return this;
};

使用方式:

var dog = new Dog();
dog.setName("旺财").setColor("白色").yelp();

取值器你也想支持链式调用?
那就用回调函数来实现,将本来应该返回的值直接传给回调函数,而return仍然返回this指针。接着上面的Dog类写一个方法:

Dog.prototype.getName(callback){
        callback.call(this,this.name);
        return this;
}

使用方式:

function showName(name){
        alert(name);
}
dog.setName("旺财").getName(showName).setColor("白色");
标签:JavaScript,设计,链式调用
0
投稿

猜你喜欢

  • 网站通过W3C标准注意点

    2010-01-14 20:15:00
  • 发现IE6下URL path不会自动补全

    2009-03-31 12:52:00
  • Oracle误添加数据文件删除方法

    2009-07-02 12:21:00
  • ASP 函数语法速查表

    2010-03-17 20:59:00
  • 用Dreamweaver MX设计各种网页鼠标样式

    2008-10-04 10:18:00
  • JS中模拟函数重载

    2008-01-03 16:46:00
  • 我跟iframe之间的误会

    2008-03-17 13:30:00
  • UCDChina.com 关于用户期望的讨论

    2008-07-10 11:55:00
  • Ubuntu下设置mysql自动备份

    2010-10-25 20:25:00
  • 兼容主流浏览器的【表情插入】源码

    2010-07-02 13:02:00
  • asp判断ip及ip段范围的一组函数小记

    2008-12-09 18:23:00
  • 在ASP编程中nothing代表什么意思?

    2011-04-15 10:47:00
  • CSS执行顺序与优先权的问题

    2010-08-23 16:21:00
  • 创建数据表/创建列的一些asp函数

    2008-06-24 12:21:00
  • 网站图片与文本谁更重要?(中英文对照)

    2008-10-17 10:25:00
  • Web页脚设计的版权格式规范

    2009-07-22 20:52:00
  • 如何以及何时使用sIFR

    2008-03-07 12:38:00
  • 那些看一眼就让你难忘的广告

    2007-09-21 19:46:00
  • Discuz!NT 论坛整合ASP程序论坛教程

    2011-03-31 11:09:00
  • DIV+CSS设计时容易犯的一些错误

    2007-11-13 12:42:00
  • asp之家 网络编程 m.aspxhome.com