在Backbone.js中覆盖Model.get(attr)的最佳方法是什么?

Ski*_*ick 22 javascript backbone.js

我第一次使用Backbone.js,并且喜欢它到目前为止.有一件事我现在无法在模型的动态属性中解决.例如,假设我有一个Person模型,我想得到他们的全名:

var Person = Backbone.Model.extend({
  getFullName: function () {
    return this.get('firstName') + ' ' + this.get('surname');
  }
});
Run Code Online (Sandbox Code Playgroud)

然后我就能做到person.getFullName().但是我想让它与其他吸气剂保持一致,更像是person.get('fullName').如果不凌乱地覆盖Person#get,我不会看到如何做到这一点.或者这是我唯一的选择?

这是我迄今为止的最重要的选择:

var Person = Backbone.Model.extend({
  get: function (attr) {
    switch (attr) {
    case 'fullName':
      return this.get('firstName') + ' ' + this.get('surname');
      break;
    case 'somethingElse':
      return this.doSomethingClever();
      break;
    default:
      return Backbone.Model.prototype.get.call(this, attr);
    }
  }
});
Run Code Online (Sandbox Code Playgroud)

我想它并不可怕,但似乎应该有更好的方法.

小智 52

这会更简单吗?

var Person = Backbone.Model.extend({
  get: function (attr) {
    if (typeof this[attr] == 'function')
    {
      return this[attr]();
    }

    return Backbone.Model.prototype.get.call(this, attr);
  }
});
Run Code Online (Sandbox Code Playgroud)

这样,您还可以使用函数覆盖现有属性.你怎么看?

  • 这是一个很好的答案.我把这个想法推进并创建了一个getter/setter插件(https://github.com/berzniz/backbone.getters.setters) (3认同)