fan*_*ncy 17 javascript backbone.js
我正在寻找一些在我的模型上创建自定义构造函数的示例.我希望结构模型/数据不同,然后将其设置为属性.
有人能告诉我一些如何做到这一点的基本例子吗?
谢谢!
JMM*_*JMM 39
如果您真的想要覆盖构造函数,请将constructor属性传递给Backbone.Model.extend(),例如:
var Klass = Backbone.Model.extend( {
constructor : function ( attributes, options ) {
// ...
}
} );
Run Code Online (Sandbox Code Playgroud)
如果要从自定义构造函数中调用内置构造函数,可以执行以下操作:
var Klass = Backbone.Model.extend( {
constructor : function ( attributes, options ) {
Backbone.Model.apply( this, arguments );
}
} );
Run Code Online (Sandbox Code Playgroud)
或者,如果您不想在子类中重复包含父类的变量的名称,或者您不想担心该变量的值发生变化,则可以执行以下操作:
var Klass;
var parent_klass = Backbone.Model.prototype;
( function ( parent_klass ) {
Klass = parent_klass.constructor.extend( {
constructor : function ( attributes, options ) {
parent_klass.constructor.apply( this, arguments );
}
} );
} )( parent_klass );
Run Code Online (Sandbox Code Playgroud)
或者如果您更喜欢@Claude建议的方式,但是在子类中重复子类变量名而不是父类var名:
var Klass = Backbone.Model.extend(
{
constructor : function ( attributes, options ) {
Klass.parent_klass.constructor.apply( this, arguments );
}
},
{
parent_klass : Backbone.Model.prototype
}
);
Run Code Online (Sandbox Code Playgroud)
如果您需要更多建议,那么您必须更具体地了解您想要完成的任务.
你应该在内置的构造函数之后想要做的任何事情initialize().
正如我在评论中提到的那样,在使用this.constructor.__super__(或this.__super__)时要小心,以免最终陷入无限循环(Maximum call stack size exceeded在Chrome中).
在控制台中尝试以下操作(风险自负,会导致前面提到的无限循环)
var A = Backbone.Model.extend({constructor: function () {
console.log("log: A");
this.constructor.__super__.constructor.apply(this, arguments);
}});
var B = A.extend({constructor: function () {
console.log("log: B");
this.constructor.__super__.constructor.apply(this, arguments);
}});
new A();
// log: A
// > Backbone.model.extend.constructor
new B();
// log: B
// (8192) log: A
// > RangeError: Maximum call stack size exceeded
Run Code Online (Sandbox Code Playgroud)
原因在于B,this在构造函数中创建A指向实例的点时B,所以this.constructor.__super__.constructor一直指向构造函数A,这种构造函数被一次又一次地调用.
如果您想要"预期行为",请使用以下语法之一:
var A = Backbone.Model.extend({constructor: function () {
console.log("log: A");
A.__super__.constructor.apply(this, arguments);
}});
var B = A.extend({constructor: function () {
console.log("log: B");
B.__super__.constructor.apply(this, arguments);
}});
new A();
// log: A
// > Backbone.model.extend.constructor
new B();
// log: B
// log: A
// > A.extend.constructor
Run Code Online (Sandbox Code Playgroud)
或直接没有__super__:
var A = Backbone.Model.extend({constructor: function () {
console.log("log: A");
Backbone.Model.apply(this, arguments);
}});
var B = A.extend({constructor: function () {
console.log("log: B");
A.apply(this, arguments);
}});
new A();
// log: A
// > Backbone.model.extend.constructor
new B();
// log: B
// log: A
// > A.extend.constructor
Run Code Online (Sandbox Code Playgroud)
这是我重写默认的Backbone.Model构造函数的方法:
Backbone.Model = (function(Model) {
// Define the new constructor
Backbone.Model = function(attributes, options) {
// Your constructor logic here
// ...
// Call the default constructor if you wish
Model.apply(this, arguments);
// Add some callbacks
this.on('event', this.myCallback, this);
};
// Clone static properties
_.extend(Backbone.Model, Model);
// Clone prototype
Backbone.Model.prototype = (function(Prototype) {
Prototype.prototype = Model.prototype;
return new Prototype;
})(function() {});
// Update constructor in prototype
Backbone.Model.prototype.constructor = Backbone.Model;
return Backbone.Model;
})(Backbone.Model);
Run Code Online (Sandbox Code Playgroud)
之后,您必须确保Backbone.Collection原型使用更新的Backbone.Model构造函数:
_.extend(Backbone.Collection.prototype, {
model: Backbone.Model
});
Run Code Online (Sandbox Code Playgroud)
在我看来,这种方法的"优势"是你可以继续使用Backbone.Model作为模型构造函数,这使得更改更加透明.
| 归档时间: |
|
| 查看次数: |
17249 次 |
| 最近记录: |