バックボーンextend
はアンダースコアと同じではありませんextend
。アンダースコアは、オブジェクトプロパティを(浅く)コピーするためextend
のループにすぎません。for
_.extend = function(obj) {
each(slice.call(arguments, 1), function(source) {
for (var prop in source) {
obj[prop] = source[prop];
}
});
return obj;
};
バックボーンextend
はその内部inherits
関数のラッパーです:
var extend = function(protoProps, classProps) {
var child = inherits(this, protoProps, classProps);
child.extend = this.extend;
return child;
};
//...
// Helper function to correctly set up the prototype chain, for subclasses.
// Similar to `goog.inherits`, but uses a hash of prototype properties and
// class properties to be extended.
var inherits = function(parent, protoProps, staticProps) {
var child;
// [Bunch of code for properly setting up the prototype chain and elided]...
return child;
};
return child
両方の呼び出しに注意してくださいextend
。inherits
両方とも新しいものを作成して返します。引数は変更しません。
_.extend
ビューの「クラス」を既存のオブジェクトに混在させるために使用する場合の問題:
_.extend(App.Views.ListView, Backbone.View.extend({});
つまり_.extend
、プロトタイプでは何_.extend
もしません。また、オブジェクトを魔法のように関数に変換しないため、何が得られるかを呼び出すことはできませnew
ん_.extend
。プロパティをビューの「クラス」に混在させることはできますが、プロパティをに混在させてprototype
、ビューを最終的な宛先に割り当てて、次の関数を取得する必要がありますApp.Views.V
。
var V = Backbone.View.extend({ ... }); // Create the view.
_.extend(V.prototype, App.Views.V); // Mix App.Views.V into its prototype.
App.Views.V = V; // Replace App.Views.V with our view function.
デモ: http: //jsfiddle.net/ambiguous/5KSbw/
そのすべてのchicaneryは、このコードを拡張および維持しなければならない貧しい魂を混乱させるので、私はそれに反対することをお勧めします。デフォルトを保持するために別のオブジェクトを使用する方がよいでしょう。
var DEFAULTS = {
Views: { ... }
};
次に、これらのデフォルトを明示的に参照します。
App.Views.ListView = Backbone.View.extend({
myVar: DEFAULTS.Views.ListView.myVar,
//...
});
ただし、問題が発生します。参照をコピーしたばかりの場合DeeperList
は、バージョンが変更されないように、コンテンツを明示的にコピーする必要があります。DEFAULTS
App.Views.ListView = Backbone.View.extend({
DeeperList: _.extend({}, DEFAULTS.Views.ListView.myVar),
//...
});
また、オブジェクトまたは配列が含まれている場合は、ディープコピーを取得するための最初の引数としてjQueryをDeeperList
使用する必要があります。$.extend
true
App.Views.ListView = Backbone.View.extend({
DeeperList: $.extend(true, {}, DEFAULTS.Views.ListView.myVar),
//...
});