`
zhouyrt
  • 浏览: 1159307 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

JavaScript中链式调用之研习

阅读更多

 

方法链一般适合对一个对象进行连续操作(集中在一句代码)。一定程度上可以减少代码量,缺点是它占用了函数的返回值。

 

一、方法体内返回对象实例自身(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;
	}
}

 

定义了function/类ClassA。有三个属性/字段prop1,prop2,prop3,三个方法methed1,method2,method3分别设置prop1,prop2,prop3。

链式调用如下:

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

 

可以看到对obj进行了连续三次操作,只要愿意ClassA的N多方法都这样定义,调用链会一直延续。


该方式缺点是链方法唯一地绑定于一种对象类型(ClaaaA),按这种方式实现链式操作,每定义一个类,其方法体中都要返回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库中获取以上灵感的。

 

分享到:
评论
1 楼 szcjlssx 2010-08-27  
呵呵,事实上只要理解了函数调用就是一个表达式,就好理解了
对于高阶函数式编程,执行函数后返回另一个函数(或其自身)是很常见的

相关推荐

    格式化-function与小括号间留空格。链式调用不换行.zip

    在JavaScript中,对象方法的链式调用是一种常见的编程模式,它允许我们在一个对象上连续调用多个方法。例如: ```javascript myObject .method1() .method2() .method3(); ``` 这里,每个方法调用后面都没有...

    在JavaScript中实现链式调用的实现

    链式调用在 JavaScript 语言界很常见,如 jQuery 、 Promise 等,都是使用的链式调用。链式调用可以让我们在进行连续操作时,写出更简洁的代码。 new Promise((resolve, reject) => { resolve(); }) .then(() =...

    javascript简单链式调用案例分析

    在JavaScript中实现链式调用的核心是每个方法都返回对象本身,即使用return this;语句。 要实现链式调用,我们首先需要了解如何构造一个对象,并为其定义一系列的方法。我们可以利用JavaScript的原型继承...

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    C#与JAVASCRIPT函数的相互调用 C#调用JAVASCRIPT函数的调用 JAVASCRIPT调用C#函数的调用

    javascript 支持链式调用的异步调用框架Async.Operation

    异步调用是JavaScript中最常见的编程模式之一,它允许程序在等待某个操作完成时继续执行其他任务。在本框架中,异步调用通过`setTimeout`函数实现,确保了任务能够在未来的某个时间点被执行,而非立即执行。 ##### ...

    Javascript 链式调用实现代码(参考jquery)

    在JavaScript中,链式调用是一种常见的编程模式,特别在像jQuery这样的库中广泛使用。链式调用允许我们连续地调用同一个对象上的方法,而不需要重复引用该对象本身。这种模式在减少代码冗余和提高可读性方面非常有效...

    JavaScript链式调用实例浅析

    在JavaScript中,链式调用是通过在对象的方法中返回对象本身来实现的,这允许开发者在一个表达式中连续调用多个方法。 在上述实例中,我们看到一个自定义的`$`函数被改造成了一个支持链式调用的工厂方法。改造的...

    详解ES6 Promise对象then方法链式调用

    这个例子展示了then方法链式调用的基本用法,也显示了如何在链式调用中处理返回值。 在另一个示例中,我们在第一个then方法中返回了另一个Promise对象,这个对象同样通过setTimeout设置了解决操作。这次,在第二个...

    Python实现类似jQuery使用中的链式调用的示例

    在JavaScript库jQuery中,链式调用被广泛应用。例如,下面这段代码展示了如何使用链式调用来添加一个类、显示元素并更改HTML内容: ```javascript $("a").addClass("test").show().html("foo"); ``` 这里,`$("a")...

    vbscript和javascript互相调用方法

    例如,定义一个VBScript函数`FormatValue`,并在JavaScript中调用它: ```html <!-- VBScript函数 --> Function FormatValue(value) FormatValue = FormatCurrency(value) End Function %> <!-- JavaScript调用...

    ActionScript与JavaScript相互调用

    - **在JavaScript中调用Flash**:使用HTML文档对象模型(DOM)中的特定语法。对于Internet Explorer浏览器,可以通过`document.getElementById('flashObject').functionName();`的形式来调用;而对于非IE浏览器,则...

    学习JavaScript设计模式(链式调用)

    链式调用是JavaScript中一种常见的设计模式,它允许我们在单个表达式中连续调用多个方法。这种模式在很多JavaScript库中被广泛使用,如jQuery、Prototype等。链式调用的核心思想在于方法执行完后返回对象本身,从而...

    JavaScript中两种链式调用实现代码

    在JavaScript编程实践中,链式调用是常见的一种编程模式,它允许我们在一个表达式中连续调用同一个对象的多个方法。链式调用的主要目的是为了提高代码的可读性和减少变量的声明,使得代码更加简洁。 链式调用的优点...

    QT和网页中的JavaScript函数进行相互调用的实现

    通过以上步骤,你可以实现在QT应用中与网页的JavaScript函数的双向调用,从而充分利用两者的优点,打造功能丰富的桌面应用。这个IntelliPlugin可能是一个帮助开发者实现上述功能的插件,包含必要的示例代码和配置...

Global site tag (gtag.js) - Google Analytics