Backbone.Model.extend不会创建实例属性

时间:2012-07-27 07:55:51

标签: javascript backbone.js

我是Backbone和JS的新手,如果我错了,请纠正我......

使用backbone.js网站上的示例,

var Note = Backbone.Model.extend({
    initialize: function() { ... },
    author: function() { ... },
    coordinates: function() { ... },
    allowedToEdit: function(account) {
        return true;
    } 
});

Backbone.js说,

  

“要创建自己的Model类,可以扩展Backbone.Model并提供实例属性,因为>以及可选的classProperties直接附加到构造函数。”

所以我创建了两个对象,

var n1 = new Note;
var n2 = new Note;

现在属性autor,allowedToEdit坐标等不是n1和n2的实例属性。它们是在 proto 链接下创建的。如何在backbone.js中创建实例属性

此外,如果我尝试在对象的javascript中修改继承的属性,则不会更改继承的属性。而是在对象实例属性中创建具有相同名称的新属性。我怎么做到这一点? 提前谢谢......

2 个答案:

答案 0 :(得分:4)

我相信你对扩展的做法有点困惑。 Extend类似于继承。如果以这种方式扩展Model,则创建一个名为Note的派生“类”,它现在具有这些成员函数。

但这不是你想要的,我不认为。您需要具有这些DATA属性的模型。将数据添加到实例很简单:

var Note = Backbone.Model.extend({});
var n1 = new Note({
    author: "Gautham",
    coordinates: {x: 200, y: 100},
    allowedToEdit: true
});

var author = n1.get("author");

换句话说,Backbone模型上的数据属性是动态的。您无需在Note推导中声明它们。

但是,如果您希望Note派生具有这种方式的属性,您可以始终将它们定义为代理到get函数:

var Note = Backbone.Model.extend({
    author: function() { return this.get('author'); },
    coordinates: function() { return this.get('coordinates'); }
    allowedToEdit: function() { return this.get('allowedToEdit'); }
});
var n1 = new Note({...});
var author = n1.author();

答案 1 :(得分:0)

您想使用默认属性,这是您期望的行为:

var Note = Backbone.Model.extend({
  defaults:function(){
    return {
      author : 'Default author',
      coordinates : [0,0],
    };
  }
});

var note1 = new Note;
var note2 = new Note;
var note3 = new Note({author: 'Daniel!', coordinates:[9,9]});

console.log( note1.toJSON() );
console.log( note2.toJSON() );
console.log( note3.toJSON() );