这个underscore.js“安全参考”代码在做什么?

时间:2013-09-13 18:10:20

标签: javascript underscore.js

我正在学习Backbone,它使用的是Underscore。

在某些示例中,我看到初始化代码创建了一个空的子数组,如下所示:

// inside a constructor function for a view object that will be extended:
this.children = _([]);

调用上面的下划线函数_定义在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;
};

在调试器中单步执行显示我首先调用return new _(obj),因此再次调用该函数,最后执行this._wrapped = objthis似乎是指_

我很困惑。为什么不首先说this.children = []

2 个答案:

答案 0 :(得分:6)

因为this.children需要是下划线的实例:包装数组的专用类,而不仅仅是常规的javascript数组文字。 _函数中的代码只是确保它总是包含一个常规数组的_个实例,即使您尝试重复重写下划线实例,也可以使用或不使用new关键字调用_

//new _ instance wrapping an array. Straightforward.
var _withNew = new _([]);

//automatically calls `new` for you and returns that, resulting in same as above
var _withoutNew = _([]);

//just gives you _withoutNew back since it's already a proper _ instance
var _doubleWrapped = _(_withoutNew);

答案 1 :(得分:1)

来自http://underscorejs.org/#chaining

您可以在面向对象或功能样式中使用Underscore,具体取决于您的偏好。以下两行代码是将数字列表加倍的相同方法。

_.map([1, 2, 3], function(n){ return n * 2; }); // Functional style
_([1, 2, 3]).map(function(n){ return n * 2; }); // OO style

因此,在使用OO样式时,_用作构造函数。如果没有构造函数中的前两行,那么"创建对Underscore对象的安全引用"您必须使用new关键字,如下所示

new _([1, 2, 3]).map(function(n){ return n * 2; });

现在你不要:)