我一直在使用 Backbone.js 并遇到了一些意想不到的事情。如果我显式设置属性,则 toJSON() (以及属性的结果)似乎只会返回 JSON 对象。问题是这样的:
- 使用一些数据扩展/继承示例对象
- 获取生成的构造函数
- 实例化/新建一个实例
- 调用
toJSON()
函数
我希望该调用返回包含所有属性(继承和绑定(bind))的对象,但结果却返回一个空的 {}
对象。
这是示例代码:
var TestModelConstructor = Backbone.Model.extend({ name: "test", num: 483 });
var testinstance = new TestModelConstructor;
console.log(testinstance.name); //prints: test
console.log(testinstance.num); //prints: 483
console.log(JSON.stringify(testinstance.toJSON())); //prints: {}
console.log(testinstance.attributes); //again empty object
testinstance.newattr = "adding new attribute";
console.log(testinstance.attributes); //{} ????
//either set explicitly by calling "set" or via constructor/initialize
testinstance.set({ label: "i can setz attributez" });
console.log(JSON.stringify(testinstance.toJSON()));
//{"label":"i can setz attributez"}
console.log(testinstance.attributes); //{"label":"i can setz attributez"}
要么这种行为很奇怪,要么我错过了文档中的某些内容。
最佳答案
我认为您应该使用 extend
函数的 defaults
参数来设置默认值。传递给扩展函数的参数将是类的成员而不是属性,这就是 toJSON
使用的。
var TestModelConstructor = Backbone.Model.extend({
defaults : { name: "test", num: 483 }
});
var testinstance = new TestModelConstructor;
....
请参阅defaults documentation了解更多详情。
需要明确的是,Backbone.Model
使用的属性存储在类的 attributes
成员中,而不是存储在实际的类本身上。这可以避免将实际模型数据与您在模型上调用的函数以及用于配置模型的设置混淆。当您将参数传递给 Model.extend
函数时,您将创建/设置这些函数和设置。
因此,当您尝试设置 testinstance.newattr
时,您实际上应该使用 testinstance.attributes.newattr
。这就是 .set
方法在幕后实际执行的操作,因此我建议仅使用 .set
。
同样,attributes documentation有更多详细信息
关于javascript - model.toJSON() 返回空对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9605991/