我真的很难理解Backbone的语法但是失败了,请看下面的代码:
var MenuItemDetails = Backbone.Model.extend({});
我查看了Backbone.js的源代码,发现了Backbone.Model的以下声明
var Model = Backbone.Model = function(attributes, options) {
var attrs = attributes || {};
options || (options = {});
this.cid = _.uniqueId('c');
this.attributes = {};
if (options.collection) this.collection = options.collection;
if (options.parse) attrs = this.parse(attrs, options) || {};
attrs = _.defaults({}, attrs, _.result(this, 'defaults'));
this.set(attrs, options);
this.changed = {};
this.initialize.apply(this, arguments);
};
据我所知var Model
现在是一个函数,它将作为构造函数。我不明白的是:
var myModelObject = new Model()
或var myModelObject = new Backbone.Model()
。相反,我们正在呼叫Backbone.Model.extend()
。这究竟如何作为构造函数?Backbone.Model.extend()
打破了我的想法。我们在另一个名为extend
Backbone.Model
的函数
醇>
答案 0 :(得分:2)
我认为你在两个不同的目标之间感到困惑:
var myModelObject = new Backbone.Model()
或var myModelObject = new MyCutomModel()
用于创建模型的新实例。
Backbone.Model.extend()
用于创建自己的自定义模块,因此您的代码看起来像这样:
var MyCutomModel = Backbone.Model.extend({
initialize: function () {
// Overwrite the default initialize function
},
customMethod: function () {
// Write your own custom method that you can use in this model
}
});
extend方法不是JavaScript的一部分。没有Javascript原生的默认extend
方法。
然而,许多图书馆都有自己的extend
方法,图书馆和个人编写自己的extend
方法非常常见(他们的做法可能会有很大不同,{{ 1}},$.extend
,_.extend
都不同;虽然Backbone.Model.extend
和$.extend
非常相似)。
Backbone有自己的自定义_.extend
方法(Read the Source Code),它基本上为对象及其原型添加了属性和方法。
创建extend
的实例后,您可以使用您在MyCutomModel
中为其定义的方法。
extend
回答问题的第二部分:是的,这有点令人困惑。这是JavaScript!
var my_custom_model = new MyCutomModel();
my_custom_model.customMethod();
是一个函数,但该函数的作用是返回一个对象。该函数还可以具有可以在该函数上调用的方法。请查看以下代码stackoveflow question:
Backbone.Model
由于JavaScript函数实际上是Function
object,因此在JavaScript中,函数返回某些内容并且还有一个方法是完全可以的。