我正在浏览 underscore 库的代码只是为了看看它是如何构建的:
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
好的,现在我将使用 _ 构造函数创建一个新实例。即使我不提供,也会使用 new 关键字,一切正常。
var _a = _([1, 2, 3, 4, 5]); // { _wrapped: [1, 2, 3, 4, 5] }
下一行的目的是什么?
if (obj instanceof _) return obj;
我可以删除它并且代码仍然可以正常工作。是不是只用来处理下面的情况?
var _b = _(_a);
最佳答案
是的,它用于处理'已经包装'的情况。
如果您将下划线实例传递给 _
,它将返回该实例而不是包装它。这就是目的:
if (obj instanceof _) return obj;
关于javascript - Underscore.js 核心,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21378939/