`
houfeng0923
  • 浏览: 145265 次
  • 性别: Icon_minigender_1
  • 来自: 大连
社区版块
存档分类
最新评论

JavaScript链式调用小结

阅读更多

zYUI3 Node对象实现链式调用的方式如下:

 

Y.one('#id').setStyle('border','1px').setAttribute('title','test');

 

大家都知道,JavaScript链式调用只是语法的招数。依据JavaScript的灵活性,实现的方法也不止一种,一起来看。

注:前两种实现我直接拷贝了 zhouyrt的文章 JavaScript中链式调用之研习 中的代码,在此谢过。

第一种链式调用方法,代码如下。缺点是每个需要链式调用的方法都要返回当前对象。

 

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;  
    }  
}
var obj = new ClassA();  
//链式调用
obj.method1(1).method2(2).method(3); // obj -> prop1=1,prop2=2,prop3=3  

 

第二种方法可以在不改变原有方法的情况下模拟链式调用。无论原有方法是否返回当前对象,都可以使用。

但使用的风格略有不同。如下:

function chain(obj){  
    var fn = function(method){  
        if(arguments.length <= 0){  
            return fn;  
        }  
        var args = Array.prototype.slice.call(arguments, 1);  
        obj[method].apply(obj, args);  
        return fn;  
    }  
    return fn;  
} 
  
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;  
    }  
}
//链式调用模拟方式
var result = chain(obj)('method1',4)('method2',5)('method3',6)();   // result -> prop1=4,prop2=5,prop3=6  
 

接下来介绍YUI中Node类实现的链式调用方法。

在YUI3中,Node类的基础是Dom,很多Node类的方法都是调用Dom类的同名方法,如上面提到的setAttribute、setStyle等,

在Dom类源码中也未设置返回本对象,在Node类提供了importMethods方法来导入Dom中相同的方法并支持链式调用。示例代码如下:

 

//Dom类及静态方法
function Dom(id){
	this.dom = document.getElementById(id);
} 

Dom.setStyle = function(node,name,value){
	node.dom.style[name] = value;
}

Dom.setAttribute = function(node,name,v){
	node.dom.setAttribute(name,v);
}


//Node类
function Node(id){
	this.dom = document.getElementById(id);
}

//添加方法的函数
Node.addMethod = function(method,fn){//,context

	Node.prototype[method] = function(){
		var me = this;
		//Array.prototype.unshift.call(arguments,me);
		//or                                               
		arguments = Array.prototype.slice.call(arguments);
		arguments.unshift(me);
		fn.apply(me,arguments);
		return me;
	} 	

}


//批量添加方法的函数
Node.importMethods = function(host,methods){
	for(var i in methods){
                var m = methods[i];
		var fn = host[m];
		Node.addMethod(m,fn);
	}
}


//定义需要给Node类添加的方法名 列表
var methods = ['setStyle','setAttribute'];

//使用批量添加方法的函数将Dom中的相关方法添加到Node中 
Node.importMethods(Dom,methods); 

//可以在Node中进行链式调用
var n = new Node('log').setStyle('border','2px solid red').setAttribute('t',22);

   

 在实际使用中,可以对原有的对象方法(如Dom中的方法)扩展到另一个类中(如Node类),在Node类中进行链式调用。当然也可以使用同样的方式(importMethods)不扩展而是覆盖Dom中的方法。

 

 

 

 

分享到:
评论

相关推荐

    JavaScript 异步调用框架 (Part 5 - 链式实现)

    最后,小结部分提到了通过修改Async.Operation,我们可以支持异步调用队列,并且这为JavaScript异步编程提供了一种强大且可读性高的解决方案。在后续内容中,将探讨如何将这种链式异步调用框架应用到更多的使用模式...

    javascript面试应急知识点小结

    2. Promise:用于处理异步操作的工具,理解Promise的状态流转和链式调用。 3. async/await:基于Promise的语法糖,使异步代码看起来更像同步代码,易于理解和维护。 五、事件循环与定时器 1. 事件循环:理解...

    【JavaScript源代码】11个Javascript小技巧帮你提升代码质量(小结).docx

    在 JavaScript 中,很多库(如 jQuery)支持链式调用,这可以极大地简化代码,并使其更加紧凑。然而,过度使用链式调用也可能导致代码难以追踪和调试,因此应谨慎使用。 #### 九、分解大型类 当类变得过于庞大时,...

    javascript Promise简洁学习用法方法小结_.docx

    3. **链式调用**:Promise支持链式调用,可以在一个then方法后面继续调用另一个then方法。 #### 四、Promise的内部实现 为了更好地理解Promise,我们可以构建一个简单的Promise实现: ```javascript function ...

    jQuery插件开发的五种形态小结

    总结来说,jQuery插件开发中的五种形态小结通过一系列的示例和说明,为开发者展示了如何创建一个高效、可维护的插件。这五个形态涉及到了代码的独立性、链式操作、插件的可配置性、生命周期的管理、无冲突处理以及...

    javascript Promise简单学习使用方法小结.docx

    ### JavaScript Promise 学习使用方法小结 #### 一、Promise 概述 在JavaScript中,Promise 是一种用于处理异步操作的模式。它提供了一种更优雅的方式来处理异步流程,避免了传统的回调地狱(Callback Hell)问题...

    javascript代码规范小结

    - 长语句可以通过适当断行提高可读性,例如使用链式调用。 - 避免在语句末尾添加多余的逗号,比如在声明数组时。 - 循环体和判断体必须使用大括号"{}"明确包围起来。 - 在使用for-in循环时,必须用...

    javascript中Number的方法小结

    使用Number构造函数创建一个数字实例后,可以链式调用各种方法进行数据格式化,比如先调用toFixed(2)方法保留两位小数,再调用toString()方法将其转换为字符串。 总之,Number对象在JavaScript中的功能非常强大且...

    JavaScript面向对象的实现方法小结

    此外,JavaScript提供了`call`和`apply`方法来改变函数调用时的上下文,即改变`this`的指向。在例子中,`sayColor.apply(o)`和`sayColor.call(o)`都将`this`设置为`o`,从而使得`sayColor`能够访问到`o`的`color`...

    JavaScript中错误正确处理方式小结你用对了吗

    例如,当使用Promise时,可以在链式调用的末尾添加`.catch`来处理错误。对于async函数,`try...catch`语句可以嵌套在函数体内部,以处理异步操作中可能出现的异常。 为了更好地处理错误,我们应该遵循以下原则: 1...

    12个提高JavaScript技能的概念(小结)

    它可以链式调用,使得异步代码更易读和管理。 9. async/await async/await是ES2017引入的特性,基于Promise提供了一种更直观的异步编程方式。async函数返回一个Promise,内部可以使用await关键字等待Promise的结果...

    javascript Promise简单学习使用方法小结

    2. **链式调用**:通过`.then()`方法可以注册对Promise成功和失败的回调函数,能够实现链式调用,也就是在成功回调函数中返回值,可以被下一个`.then()`接收,实现异步操作的顺序执行。 3. **解决和拒绝Promise**:...

    jquery 用法小结

    使用插件通常涉及在页面头部引入插件的脚本,然后调用相应方法。例如,使用一个名为 "slideshow" 的插件展示图片: $("#slideshow").slideshow(); 总的来说,jQuery 是一个强大且易用的 JavaScript 库,简化了 DOM ...

    ECMAScript 6 技术扫盲,快速学习ES6,进入Javascript开发ES6时代

    - 箭头函数的 `this` 值取决于定义时所在的上下文,而不是调用时的上下文,这使得在某些场景下更容易管理。 #### 3. 函数参数默认值 ES6 允许开发者直接在函数声明时设置参数的默认值。这使得函数更具可读性和灵活...

    js this关键字_面向对象编程.pdf

    小结 面向对象编程在 JavaScript 中虽然不像其他语言那样直观,但通过巧妙地利用函数、`this` 关键字和原型链,可以实现灵活而强大的面向对象设计。掌握这些概念不仅有助于编写更高效、更易于维护的代码,还能更好...

    常用的JQuery函数及功能小结_.docx

    - `end()`用于在链式调用中恢复到之前的状态。 5. **访问 DOM 元素** 使用`get()`方法可以从JQuery对象中获取原始DOM元素,如`$('#some-id').get(0)`或`$('#some-id')[0]`可以获取第一个匹配元素的DOM节点。 6....

Global site tag (gtag.js) - Google Analytics