Underscorejs将功能更改为对象

时间:2015-01-21 15:30:13

标签: javascript functional-programming underscore.js

编辑:我意识到我将MyConstructorFunc.prototype传递给了`_.extend()。

当我想用Underscore扩展一个函数时,我遇到了一个有趣的实现细节。

我构建了一个函数构造函数,

var MyConstructorFunc = function() {
  ...
}

然后我返回了

的结果
return _.extend(MyConstructorFunc.prototype, {
  \\ ...some properties...
}

我得到的是typeof MyConstructorFunc == "object"!如果_.extend将属性合并为function,为什么会返回object

查看_.extend函数,我看不到发生的地方......

_.extend = function(obj) {
    if (!_.isObject(obj)) return obj;
    var source, prop;
    for (var i = 1, length = arguments.length; i < length; i++) {
      source = arguments[i];
      for (prop in source) {
        if (hasOwnProperty.call(source, prop)) {
            obj[prop] = source[prop];
        }
      }
    }
    return obj;
  };

如果我MyConstructorFunc["someProp"] = someObject["someProp"]return MyConstructorFunc,我又返回了一个JavaScript object

我错过了什么......

1 个答案:

答案 0 :(得分:2)

您可能正在将Function对象传递给_.extend。您的示例代码没有显示它,但是如果您使用&#34; new&#34;来创建MyConstructorFunc的新实例。关键字,然后结果将是一个对象。

var MyConstructorFunc = function() {
}

var foo = _.extend(MyConstructorFunc, {a:1});
console.log(typeof foo); // function 

var funcObj = new MyConstructorFunc();
console.log(typeof funcObj); //object

扩展MyConstructorFunc本身将返回一个函数类型。一旦你使用构造函数创建一个给你一个对象的新函数。