1.先举一个小例子,什么是链式编程
<script type="text/javascript" charset="utf-8">
// 1.简单的函数链式调用
function Dog() {
this.run = function(){
alert('dog is run');
return this;
};
this.eat = function() {
alert('dog is eat');
return this;
};
this.sleep = function() {
alert('dog is sleep');
return this;
};
}
var d1 = new Dog();
d1.run();
d1.eat();
d1.sleep();
d1.run().eat().sleep();
</script>
2.模拟jquery底层代码实现
<input id = "input" type = "button" value="click me"/>
<script type="text/javascript" charset="utf-8">
// 模拟jquery底层链式编程
// 块级作用域
/**
(function(){
// 特点一,程序启动即执行
alert('i am running');
// 特点二,内部的成员变量,外部无法访问。除了不加var修饰的变量
})();
*/
(function(window, undifined){
// $ 最常用的符号 返回给外界
// 大型程序开发,一般使用'_'作为私有的对象,这是一个编程规范
function _$(arguments){
// 实现代码..。
// 正则表达式匹配ID 选择器
var idSelector = /#w+/;
// 定义一个内置属性来接收得到元素
this.dom;
// 如果匹配成功接收DOM元素
if(idSelector.test(arguments[0])) {
this.dom = document.getElementById(arguments[0].substring(1));
} else {
throw new Error('arguments is error');
}
}
// 在Function上扩展一个可以实现链式编程的方法。
Function.prototype.method = function(methodName, fn){
this.prototype[methodName] = fn;
// 链式编程的关键
return this;
};
// 在_$的原型对象上加一些公共的方法。
_$.prototype = {
constructor : _$,
addEvent : function(type, fn){
// 给得到的元素注册时间
// FireFox
if(window.addEventListener) {
this.dom.addEventListener(type, fn);
}
// IE
else if (window.attachEvent) {
this.dom.attachEvent('on' + type, fn);
}
return this;
},
setStyle : function(prop, val){
this.dom.style[prop] = val;
return this;
}
};
// window上 先注册一个全局变量 与外界产生关系
window.$ = _$;
// 写一个准备的方法
_$.onReady = function(fn) {
// 1.实例化出来_$对象 真正的注册到window上
window.$ = function() {
return new _$(arguments);
};
// 2.执行传入进来的代码
fn();
// 3.实现链式编程
_$.method('addEvent', function(){}).method('setStyle', function(){});
};
})(window);// 程序的入口,window传入作用域中
// test
$onReady(function() {
var input = $('#inp');
input.addEvent('click', function(){
alert('我被点击了!');
}).setStyle('backgroundColor', 'red');
});
</script>