之前看jquery,它的链式调用是通过return this(返回对象本身)来实现。
underscore怎么实现链接式调用?
//开启链接式的调用
_.chain = function(obj) {
var instance = _(obj);
instance._chain = true;
return instance;
}
首先给underscore实例对象添加一个_chain属性;代表开启了链接调用;
_.map = function(obj, iteratee, context) {
//生成不同功能迭代器
var iteratee = cb(iteratee, context);
//分辨 obj是数组对象, 还是object对象
var keys = !_.isArray(obj) && Object.keys(obj);
var length = (keys || obj).length;
var result = Array(length);
for (var index = 0; index < length; index++) {
var currentKey = keys ? keys[index] : index;
result[index] = iteratee(obj[currentKey], index, obj);
}
return result;//数组
}
函数返回的都是数组,这个返回的数组经过mixin函数的包装调用result函数;
//mixin
_.mixin = function(obj) {
_.each(_.functions(obj), function(name) {
var func = obj[name];
_.prototype[name] = function() {
var args = [this._wrapped];
push.apply(args, arguments);
// instance
return result(this, func.apply(this, args));
//func指代map
}
});
}
//辅助函数 obj 数据结果
var result = function(instance, obj) {
return instance. //辅助函数 obj 数据结果
var result = function(instance, obj) {
return instance._chain ? _(obj).chain() : obj;
}
}
判断underscore对象中(this)是否有这个_chain属性,如果有就给_(obj)添加一个_chain属性;这样就可以一个一个传递下去了。
到最后要输出结果时,调用:
_.prototype.value = function() {
return this._wrapped;
}