扩展函数返回的属性?

时间:2014-05-29 12:19:24

标签: javascript backbone.js

我是一名JS初学者。我在Backbone模型上定义了一个函数,如下所示。

myFunction: function () {
  return {
    firstAttr: this.model.get('value-attribute')
  };
}

我可以this.myFunction使用它。

从代码中的其他位置,我想扩展this.myFunction以返回另一个属性。换句话说,我希望它返回一个包含两个属性的词典:{ firstAttr: 'something', secondAttr: true }

我该怎么做?

我试过了:

this.myFunction().secondAttr = true;

但我知道这是错误的。

2 个答案:

答案 0 :(得分:2)

假设您的模型原型看起来像

var MyModel = Backbone.Model.extend({
    myFunction: function () {
        return {
            // I assume you work directly on a model
            // the principle would be the same with a wrapper object
            firstAttr: this.get('value-attribute')
        };
    }
});

您可以在模型基础上屏蔽您的方法,如下所示:

var m = new MyModel({'value-attribute': 'attr, the first'});
console.log(m.myFunction());

m.myFunction = function () {
    var res = MyModel.prototype.myFunction.call(this);
    res.secondAttr = true;
    return res;
};
console.log(m.myFunction());

请参阅http://jsfiddle.net/V8zt2/了解演示

或动态修改原型以更改所有实例:

var f = MyModel.prototype.myFunction;
MyModel.prototype.myFunction = function () {
    var res = f.call(this);
    res.secondAttr = true;
    return res;
};

var m = new MyModel({'value-attribute': 'attr, the first'});
console.log(m.myFunction());

http://jsfiddle.net/V8zt2/1/

答案 1 :(得分:0)

如何将myFunction修改为:

myFunction : function () {
    var i,
        obj = {};
    for (i=0; i< arguments.length;i++){
        obj['attribute'+(i+1)] = this.model.get(arguments[i]);
    }
  return obj;
}

通过这种方式,您可以将keys model的{​​{1}}作为myFunction的参数发送到返回的对象中。