モデルにカスタムコンストラクターを作成するためのいくつかの例を探しています。モデル/データの構造を別の方法で設定し、それを属性として設定するだけです。
誰かがこれを行う方法のいくつかの基本的な例を教えてもらえますか?
ありがとう!
モデルにカスタムコンストラクターを作成するためのいくつかの例を探しています。モデル/データの構造を別の方法で設定し、それを属性として設定するだけです。
誰かがこれを行う方法のいくつかの基本的な例を教えてもらえますか?
ありがとう!
本当にコンストラクタをオーバーライドしたい場合は、次のようにconstructor
プロパティをに渡しますBackbone.Model.extend()
。
var Klass = Backbone.Model.extend( {
constructor : function ( attributes, options ) {
// ...
}
} );
カスタム コンストラクターから組み込みコンストラクターを呼び出したい場合は、次のようにすることができます。
var Klass = Backbone.Model.extend( {
constructor : function ( attributes, options ) {
Backbone.Model.apply( this, arguments );
}
} );
または、親クラスを含む変数の名前をサブクラス全体で繰り返す必要がない場合、またはその変数の値が変化することを心配したくない場合は、次のようなことができます。
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 );
または、@Claude が提案する方法を好むが、親クラスの変数名の代わりにサブクラス内でサブクラス変数名を繰り返す場合:
var Klass = Backbone.Model.extend(
{
constructor : function ( attributes, options ) {
Klass.parent_klass.constructor.apply( this, arguments );
}
},
{
parent_klass : Backbone.Model.prototype
}
);
それ以上のアドバイスが必要な場合は、達成したいことをより具体的にする必要があります。
ビルトイン コンストラクター機能の後に実行したいことはすべて、おそらく で実行する必要がありますinitialize()
。
コメントで述べたように、this.constructor.__super__
(または) を使用するときは注意してください。( Chrome で)this.__super__
無限ループに陥らないようにしてください。Maximum call stack size exceeded
コンソールで次のことを試してください(自己責任で、前述の無限ループにつながります)
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
その理由は、 を作成するときに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
または直接なしで__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
これは、デフォルトの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);
その後、Backbone.Collectionプロトタイプが更新されたBackbone.Modelコンストラクターを使用していることを確認する必要があります。
_.extend(Backbone.Collection.prototype, {
model: Backbone.Model
});
私の意見では、このアプローチの「利点」は、モデルコンストラクターとしてBackbone.Modelを引き続き使用できることです。これにより、変更がより透過的になります。
自分でモデルを書きたい場合は、次のようにします。
var YourModel = function () {
// your constructor here
};
_.extend(YourModel.prototype, Backbone.Model.prototype, {
// your model method here
});
Backbone.Model
注意してください。コンストラクターのソースコードを参照する必要があると思います。しかし、これは良い考えではないと思います。オーバーライドinitialize
メソッドは正しい方法です。
var YourModel = Backbone.Model.extend({
initialize: function (attrs, options) {
Backbone.Model.prototype.initialize.apply(this, arguments); // call super constructor
// your constructor code here
}
});
initialize
メソッドを探しているようです。新しいモデルを作成するときに呼び出され、必要な場合に if を使用できます。
var myModel = Backbone.Model.extend({
initialize: function() {
// do something besides setting attributes or model
alert('myModel is ready for action!');
}
});
new myModel();
constructor
もっと複雑なことをしたい場合は、Backbone コアのメソッドをオーバーライドできます。ただし、それははるかにトリッキーなビジネスです。可能であれば、公開されたメソッドを使用する方がはるかに優れています!
Backbone.Model コンストラクターをオーバーライドするときに注意すべき点 - 呼び出さないとBackbone.Model.apply
、Model.cid が設定されない可能性があります。
それは悪いことです - cid が複数のモデルにまたがって設定されていない場合、コレクションはそれをコレクション内の最初のモデルの複製と見なす可能性があり、追加を許可しません。