在我们所用到的库中,可以看到很多诸如
$(window).addEvent('load', function(){
$('test').show().setStyle('color', 'red').addEvent('click', function(e){
$(this).setStyle('color', 'yellow');
});
});
的链式调用,那么这样的链式结构是怎么实现的呢,下面我们利用代码来探讨一番:
先分解下,我们队$函数已经很熟悉了,他通常返回一个HTML元素或者HTML元素的集合,如下所示:
function $(){
var elements = [];
for(var i = 0, len = arguments.length; i < len; i++){
var element = els[i];
if(typeof element === 'string'){
element = document.getElementById(element);
}
elements.push(element);
}
return elements;
}
但是,如果把这个函数改造为一个构造器,把那些元素作为数组保存在一个实例属性中,并让所有定义在构造器函数的prototype属性所指对象中的方法都返回用以调用放方法的那个实例的引用,那么他就具有了进行链式调用的能力。
先别说的太远,我们首先需要把这个$函数改为一个工厂函数,他负责创建支持链式调用的对象。
(function(){
function _$(els){
this.element = [];
for(var i = 0, len = els.length; i < len; i++){
var element = els[i];
if(typeof element === 'string'){
element = document.getElementById(element);
}
this.element.push(element);
}
return this;
}
window.$ = function(){
return new _$(arguments);
}
})();
由于所有对象都会继承其原型对象的属性和方法,所以我们可以让定义原型对象中的那几个方法都返回用以调用方法的实例对象的引用,这样既可以对那些方法进行链式调用,想好这一点,我们现在就动手在_$这个私用构造函数的prototype对象那个中添加方法,以便实现链式调用。
(function(){
function _$(els){
this.element = [];
for(var i = 0, len = els.length; i < len; i++){
var element = els[i];
if(typeof element === 'string'){
element = document.getElementById(element);
}
this.element.push(element);
}
return this;
}
_$.prototype = {
each: function(fn){
for(var i = 0, len = this.element.length; i < len; i++){
fn.call(this, this.element[i]);
}
return this;
},
setStyle: function(prop, val){
this.each(function(el){
el.style[prop] = val;
});
return this;
},
show: function(){
var that = this;
this.each(function(el){
that.setStyle('display', 'none');
});
return this;
},
addEvent: function(type, fn){
var add = function(el){
if(window.addEventListener){
el.addEventListener(type, fn, false);
}else if(window.attachEvent){
el.attachEvent('on' + type, fn);
}
};
this.each(function(el){
add(el);
});
}
};
window.$ = function(){
return new _$(arguments);
}
})();
看看该类每个方法的最后一行,你会发现他们都是以"return this;"结束,这样将用以调用方法的对象传给调用链上的下一个方法。
分享到:
相关推荐
在JavaScript中,链式调用是一种常见的编程模式,特别在像jQuery这样的库中广泛使用。链式调用允许我们连续地调用同一个对象上的方法,而不需要重复引用该对象本身。这种模式在减少代码冗余和提高可读性方面非常有效...
链式调用不换行"这一主题主要涉及JavaScript编程语言中的代码规范,包括函数调用时的空格使用以及链式调用的样式规则。 首先,我们来探讨函数调用时的小括号前后的空格问题。在JavaScript中,根据一些流行的编码...
链式调用主要有三种实现方式: 1. **`this`的作用域链**:这是最常见的方式,通常在原型链上实现。例如jQuery库,它在每个方法内部都返回`this`,以便继续调用其他方法。例如: ```javascript var Person = ...
链式调用实现本身比较简单,也有很多文章详细阐述了其实现方式。本文更多从链式调用方法返回值的角度,更进一步来说明如何实现链式调用。 什么是链式调用 链式调用在 JavaScript 语言界很常见,如 jQuery 、 ...
链式调用通常有以下几种实现方式,但是本质上相似,都是通过返回对象供之后进行调用。 this的作用域链,jQuery的实现方式,通常链式调用都是采用这种方式。 返回对象本身, 同this的区别就是显示返回链式对象。 ...
### JavaScript支持链式调用的异步调用框架Async.Operation #### 一、概述 在JavaScript编程中,异步操作是非常常见的一种需求。随着ES6的发布及其后续版本的不断迭代,JavaScript语言本身以及社区围绕着异步处理...
本文将深入探讨JavaScript链式调用的概念、实现方式以及如何在一个已有的库或框架中应用。 首先,链式调用的核心是使方法返回对象自身,这样在一个方法调用结束后,可以直接调用该对象上的其他方法,无需再存储对象...
在JavaScript中实现链式调用的核心是每个方法都返回对象本身,即使用return this;语句。 要实现链式调用,我们首先需要了解如何构造一个对象,并为其定义一系列的方法。我们可以利用JavaScript的原型继承...
在JavaScript编程中,链式调用是一种常见的编程技巧,它...在实际应用中,可以根据项目需求和个人喜好选择适合的链式调用实现方式。无论选择哪种方法,理解其工作原理对于编写高效、可维护的JavaScript代码至关重要。
### JavaScript支持链式调用的异步调用框架Async.Operation #### 一、概述 在JavaScript编程中,处理异步操作是一项常见的需求。随着ES6及后续版本的引入,Promise等现代API为开发者提供了更优雅的异步编程方式。...
MySQLs是一款专为Node.js设计的SQL语句生成器,其特点是通过链式调用的方式提供了灵活的操作体验。在Node.js的开发环境中,与数据库交互是必不可少的一部分,而MySQLs插件则为开发者提供了一个高效且易用的工具,...
总的来说,JavaScript的链式调用是通过返回对象自身来实现的,它提高了代码的可读性和效率,使得复杂的对象操作变得简单。理解链式调用的原理和`this`的用法是JavaScript开发中不可或缺的一部分。在实际开发中,合理...