JavaScript链式调用:返回this与链式包装器两种实现方案

作者:小括号时间:2026-10-25 18:48:28浏览:651

本文介绍JavaScript中实现链式调用的两种主要方式。第一种方法要求每个方法返回对象实例this,适用于单一类;第二种方法通过链式包装器函数处理任意对象,无需修改原方法即可实现链式调用。文章对比了两种方式的代码结构、使用场景及优缺点,帮助开发者根据实际需求选择合适的实现方案。

一、方法体内返回对象实例自身(this)

方法体内返回对象实例自身(this)

代码如下:

 
function ClassA(){
this.prop1 = null;
this.prop2 = null;
this.prop3 = null;
} 
ClassA.prototype = {
method1 : function(p1){
this.prop1 = p1;
return this;
}, 
method2 : function(p2){
this.prop2 = p2;
return this;
}, 
method3 : function(p3){
this.prop3 = p3;
return this;
} 
} 

上述代码定义了一个名为ClassA的函数(或类)。该类包含三个属性:prop1、prop2和prop3,以及三个对应的方法:method1、method2和method3,分别用于设置这三个属性的值。


链式调用示例如下:


代码如下:

 
var obj = new ClassA();
obj.method1(1).method2(2).method(3); // obj -> prop1=1,prop2=2,prop3=3

可以看到,对obj对象连续执行了三次操作。只要按照这种方式定义ClassA的多个方法,调用链就可以无限延续下去。


这种方式的缺点是,链式方法必须严格绑定于特定的对象类型(如ClassA)。每定义一个新类,其所有方法体中都必须显式返回this。第二种方式可以解决这一局限性。


二、对象传入后每次调用返回函数自身

对象传入后每次调用返回函数自身

代码如下:

 
/** 
* chain 精简版
* @param {Object} obj
*/ 
function chain(obj){
return function(){
var Self = arguments.callee; Self.obj = obj;
if(arguments.length==0){
return Self.obj;
} 
Self.obj[arguments[0]].apply(Self.obj,[].slice.call(arguments,1));
return Self;
} 
} 
//定义的function/类ClassB
function ClassB(){
this.prop1 = null;
this.prop2 = null;
this.prop3 = null;
} 
ClassB.prototype = {
method1 : function(p1){
this.prop1 = p1;
}, 
method2 : function(p2){
this.prop2 = p2;
}, 
method3 : function(p3){
this.prop3 = p3;
} 
} 

注意,ClassB的method1、method2和method3中不再需要返回this。



链式调用示例如下:



代码如下:

 
var obj = new ClassB();
chain(obj)('method1',4)('method2',5)('method3',6); // obj -> prop1=4,prop2=5,prop3=6

第一种方式在3次调用后返回了对象自身,而这里使用一个空括号"()"来取回对象。



代码如下:

 
// result -> prop1=4,prop2=5,prop3=6
var result = chain(obj)('method1',4)('method2',5)('method3',6)();

这种方式在编写类时,方法体中无需返回this,且可以对任何对象进行链式调用。



从写法上总结两种调用方式的区别:



代码如下:

 
obj
.method1(arg1)
.method2(arg2)
.method3(arg3)
... 
chain(obj)
(method1,arg1)
(method2,arg2)
(method3,arg3)
... 

最后,感谢沐海,我是从wee库中获取以上灵感的。



/201101/yuanma/chain.rar

作者最新文章