下划线的_.property()函数的_.function()版本

时间:2014-03-05 17:03:51

标签: javascript underscore.js

Underscore有一个Object函数_.property(key),它返回一个函数,该函数本身返回任何传入对象的'key'属性。例如:

var moe = {name: 'moe'};
var propFunction = _.property('name');
var value = propFunction(moe);
=> 'moe'

我想知道除了对象的属性之外,Underscore是否还有一种很好的方法可以使用对象的函数获得相同的行为。我很确定它没有一个功能,但我想知道是否有一些合理的功能组合可以一起完成我想要的功能。例如:

var moe = {getName: function() { return 'moe'; }};
var funcFunction = _.underscoreGoodnessHere('getName');
var value = funcFunction(moe);
=> 'moe'

这将删除一些伪实际代码中的一些样板:我有这样的:

this.collection.filter(function(model) { return model.isHidden(); });
// could change to this:
this.collection.filter(_.underscoreGoodness('isHidden'));

对于它的价值,如果没有一个很好的方式来做我所问过的但是你仍然有更好的方法来编写上面的伪实际代码,我仍然喜欢听到它!

4 个答案:

答案 0 :(得分:3)

您正在寻找Underscore在_.invoke()中使用的回调函数 - 但这不是公开的。您可以自己轻松构建它:

_.method = function(name) {
  var args = _.tail(arguments),
      isFunc = _.isFunction(name);
  return function(value) {
    return (isFunc ? name : value[name]).apply(value, args);
  };
};

答案 1 :(得分:2)

您可以创建基于_.property

的自己的功能
function callProperty(prop) {
    var getProperty = _.property(prop);
    return function(obj) {
        return getProperty(obj)();
    };
}

答案 2 :(得分:2)

最短的我能想到的是:_.result()

function functionProp(prop){
    return function(obj){
        return _.result(obj, prop);
    };
}

这实际上也适用于非功能属性。所以:

var moe = {getName: function() { return this.name; }, name: 'moe'};
'moe' == functionProp('getName')(moe);
'moe' == functionProp('name')(moe);

答案 3 :(得分:0)

Underscore的property函数不区分“功能属性”和“常规属性”。对它来说,存储在属性名称下的函数对象是属性值本身。扩展您提供的示例,您将看到以下内容:

var moe = {getName: function() { return 'moe'; }};
var funcFunction = _.property('getName');
var getter = funcFunction(moe);
=> function() { return 'moe'; }
var value = getter();
=> 'moe'

funcFunction(moe)();
=> 'moe'

如果您想构建自己的,可以执行以下操作:

function functionalProperty(name) {
    var getter = _.property(name);
    return function (o) { return getter(o); };
}

或者,如果您想支持具有相同功能的两种类型的属性,则可以执行此操作

function anyProperty(name) {
    var getter = _.property(name);
    return function (o) {
        var val = getter(o);
        return _.isFunction(val) ? val() : val;
    };
}

请注意,您只将此用于实际属性,而不是您不想真正调用的函数。