我刚刚创建了一个像 underscoer.js 这样的小型 js 框架。方法调用由 执行mc_.grep([1,2,3,4], function(val){ return val > 2; });
。我怎样才能让它更像 jQuery 风格mc_(var).grep(func..).map(func..);
?有任何想法吗?还有我怎样才能让图书馆变得更好?
问问题
121 次
3 回答
3
如果您的意思是每次从必须返回的函数返回时都希望链接函数调用,则必须返回包装在框架核心的基本对象中的内容,以便您可以调用下一个方法返回的对象。
例如(这是非常基本的)$('#someid')
调用由 jQuery 像这样返回
this.length = 1;
this[0] = elem;
}
this.context = document;
this.selector = selector;
return this;
于 2012-04-05T13:14:09.973 回答
2
// Your function should return a wrapped object
function Wrap(list) {
return Object.create(Wrap).constructor(list)
}
// set the list as an internal property
Wrap.constructor = function (list) {
this._list = list
return this
}
// map function works in one of two ways, if it has an internal _list property
// then it was called as Wrap(list).map(...)
// then call the map function on it with the arguments
// store the result as a new list as _list
// return this so you can chain
//
// If it's not then it was used as Wrap.map(list, ...)
// extract the arguments using [].slice(arguments, 1)
// then return the result of invoking it
Wrap.map = function (list) {
if (this._list) {
this._list = this._list.map.apply(this._list, arguments)
return this
} else {
return list.map.apply(list, [].slice.call(arguments, 1))
}
}
// Wrappers need an unwrap method
// Wrap(list).map(...).filter(...).reduce(...).get()
Wrap.get = function () {
return this._list
}
于 2012-04-05T13:17:59.213 回答
1
维基百科上有一篇很好的文章,叫做“方法链”。
一个过度简化的链接示例,也可用作工作 jsfiddle(只需打开控制台F12以查看结果)如下:
var a = {
b: function () {
console.log('b');
// Make method chainable:
return this;
},
c: function () {
console.log('c');
// Make method chainable:
return this;
}
};
// Now you can do:
a.b().c();
我建议看一下带注释的 underscore.js 源代码,以避免“哦该死,我花了这么多时间重新发明轮子”的感觉。
怎么提高?我只知道一种方法:让它有用。
于 2012-04-05T14:06:45.880 回答