在我问this question并意识到Backbone.Collection
严格用于Backbone.Models
之后,我有点失望。
我所希望的:
使下划线的方法更加面向对象:
_.invoke(myCollection, 'method'); ==> myCollection.invoke('method');
我会承认,微小的差别,但它似乎仍然很好。
如果我对非Backbone.Collection
使用Backbone.Models
会遇到什么问题?
是否有任何现有的实现,或者制作通用下划线集合类的简单方法?
答案 0 :(得分:1)
虽然你不能在不使用模型的情况下使用Backbone Collection,但我想出了一种巧妙的方法将下划线混合到Array原型中:
// This self-executing function pulls all the functions in the _ object and sticks them
// into the Array.prototype
(function () {
var mapUnderscoreProperty = function (prp) {
// This is a new function that uses underscore on the current array object
Array.prototype[prp] = function () {
// It builds an argument array to call with here
var argumentsArray = [this];
for (var i = 0; i < arguments.length; ++i) {
argumentsArray.push(arguments[i]);
}
// Important to note: This strips the ability to rebind the context
// of the underscore call
return _[prp].apply(undefined, argumentsArray);
};
};
// Loops over all properties in _, and adds the functions to the Array prototype
for (var prop in _) {
if (_.isFunction(_[prop])) {
mapUnderscoreProperty(prop);
}
}
})();
以下是如何使用新阵列原型的示例:
var test = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
console.log(test.filter(function (item) {
return item > 2 && item < 7;
})); // Logs [3, 4, 5, 6]
console.log(test); // Logs the entire array unchanged
此解决方案可能会为Array原型添加更多实际有用的内容,但它可以为您提供大部分功能。另一个解决方案是只添加具有迭代器参数的函数,但这是一个开始。