创建Underscore中使用的安全参考对象技术

时间:2014-11-04 08:48:39

标签: javascript underscore.js

当我查看Underscore中的代码时:http://underscorejs.org/docs/underscore.html

我遇到了

var _ = function(obj) {
  if (obj instanceof _) return obj;
  if (!(this instanceof _)) return new _(obj);
  this._wrapped = obj;
};

带评论

  

创建对Underscore对象的安全引用,以供下面使用。

我真的不明白这个目的。而不是

(function() {
    var _ = function(obj) {
        if (obj instanceof _) return obj;
        if (!(this instanceof _)) return new _(obj);
        this._wrapped = obj;
    };

    _.VERSION = '1.7.0';
})();

为什么我们不能简单地拥有

(function() {
    var _ = {};

    _.VERSION = '1.7.0';
})();

我是否知道为什么Underscore项目使用的技术背后的想法?

1 个答案:

答案 0 :(得分:2)

这会强制使用构造函数模式创建对象:_()等同于new _()

然后,如果要扩展所有实例的行为,即使用_(obj)创建的对象(或new _(obj),内存使用量有限,则可以扩展构造函数的原型。

function Ctor(){}

Ctor.prototype.someFunction=function(){};

var instance1=new Ctor();
var instance2=new Ctor();

会以某种方式等同于

function factory(){
   var obj={};
   obj.someFunction=function(){}
   return obj;
}

var instance1=factory();
var instance2=factory();

但第二个版本将使用更多内存,因为它会将函数添加到每个实例而不是单个通用原型