我正在浏览下划线库的代码,看看它是如何构建的:
http://underscorejs.org/underscore.js
我理解其中的大部分内容,其中包含了一些评论,但有些部分我还不明白:
// Create a safe reference to the Underscore object for use below.
var _ = function(obj) {
if (obj instanceof _) return obj;
if (!(this instanceof _)) return new _(obj);
this._wrapped = obj;
};为了了解它的工作原理,我对它做了一些改动:
function _(obj) {
if (obj instanceof _) {
return obj;
}
if (!(this instanceof _)) {
return new _(obj);
}
this._wrapped = obj;
}
// just an example, if statement to check if array
// is really an array should be added
_.sum = function (array) {
var sum = 0;
for (var i = 0, ilen = array.length; i < ilen; i += 1) {
sum += array[i];
}
return sum;
}
_.sum([1, 2, 3, 4, 5]); // 15好的,现在我将使用_构造函数创建一个新实例。新关键字将被使用,即使我不提供它,一切都很好。
var _a = _([1, 2, 3, 4, 5]); // { _wrapped: [1, 2, 3, 4, 5] }下面一行的目的是什么?
if (obj instanceof _) return obj;我可以删除它,而且代码仍然正常工作。它是否仅用于处理以下情况?
var _b = _(_a);发布于 2014-01-27 13:13:40
是的,它是用来处理‘已经包装’的情况。
如果将下划线实例传递给_,它将返回该实例而不是包装它。这就是目的:
if (obj instanceof _) return obj;作为证据- 下面是一个bug,它将此添加到解决方案中.
https://stackoverflow.com/questions/21378939
复制相似问题