37

これをこの回答に対する質問として提起したいのですが、そうすることができないようです。申し訳ありません。

サブクラスのデフォルトを拡張すると、スーパークラスに反映されます。これは目的に反しているようで、探している構造を取得するために、サブクラスにスーパークラスのデフォルトを明示的にリストする傾向があります。

var Inventory = Backbone.Model.extend({
    defaults: {
        cat: 3,
        dog: 5
    }
});

var ExtendedInventory = Inventory.extend({
});

_.extend(ExtendedInventory.prototype.defaults, {rabbit: 25});

var i = new Inventory();
var ei = new ExtendedInventory();
console.log(i.attributes);
console.log(ei.attributes);

これは以下を出力します:

{cat: 3, dog: 5, rabbit: 25}
{cat: 3, dog: 5, rabbit: 25}

私が(または、私が仮定すると、op)欲しいものではありません:

{cat: 3, dog: 5}
{cat: 3, dog: 5, rabbit: 25}
4

7 に答える 7

50

問題は、参照をオーバーライドInventory.prototype.defaultsExtended.prototype.defaultsていないため、参照が同じであることです。

したがって、これを2つの方法で行うことができますが、おそらくそれ以上ですが、この2つしか見つかりませんでした:

編集:最初の例は正しくありません (コメントを参照)。2番目を参照してください。

var ExtendedInventory = Inventory.extend({
    defaults: {
        rabit:25
    }
});

_.extend(ExtendedInventory.prototype.defaults, Inventory.prototype.defaults);

また

var ExtendedInventory = Inventory.extend({
    defaults: _.extend({},Inventory.prototype.defaults,
         {rabit:25}
    )
});

最初の方がきれいに見えると思います。

于 2011-07-01T15:48:56.760 に答える
18

これを解決する最善の方法は、underscore.js の _.defaults メソッドを使用することだと思います。これにより、Model サブクラスのデフォルト値をオーバーライドできます。

_.defaults(ExtendedInventory.prototype.defaults, 
           Inventory.prototype.defaults);

次の例を参照してください。

http://jsfiddle.net/mattfreer/xLK5D/

于 2011-12-13T17:28:11.447 に答える
3

JCorcueraの回答の拡張として、基本クラスがデフォルトを定義する関数を使用する(または使用する可能性がある)場合、これはうまく機能します:

   defaults: function() {                                     
     return _.extend( _.result(Slot.prototype, 'defaults'),{  
       kind_id: 6,                                  
       otherthing: 'yello'  
       // add in your extended defaults here                                
   })}                                                      

重要なのは、子のデフォルト メソッドと_.result() ドキュメントで関数を使用することです。

于 2013-05-20T03:33:42.160 に答える
0
var MoveToolModel = ToolModel.extend({
    extendDefaults: {
        cursor: 'move'
    },
    initialize: function() {
        ToolModel.prototype.initialize.apply(this, arguments);
        this.defaults = _.extend({}, this.defaults, this.extendDefaults);
    },
    draw: function(canvasContext, data) {
        //drag
    }
});
于 2014-04-28T14:51:15.500 に答える
0

ExtendedInventory.defaults に rabbit を追加した結果、Inventory.prototype.defaults が変更されないようにしたいというあなたの意見は正しいと思います。私のプロトタイプの継承は、以下が機能する理由を明確に説明するのに十分ではありませんが、これはあなたがやりたいことをしていると思います.

ExtendedInventory.defaults = {}
_.extend(ExtendedInventory.defaults, ExtendedInventory.prototype.defaults, {rabbit: 25});

_.extend メソッドについて覚えておくべき重要な点は、最初の引数がdestination. 最初の引数の後の引数からすべての属性を取得し、宛先引数に配置します。

もう 1 つのポイントは、ExtendedInventory.prototype.defaults === Inventory.prototype.defaults の結果が true になり、同じオブジェクトであることを意味するため、ExtendedInventory のプロトタイプを変更すると、Inventory のプロトタイプを変更することになります (理由はわかりません)。そもそも等しいですが)。

于 2011-07-01T15:41:59.650 に答える
0

underscore.js は値を深く拡張しないと思います。配列がある場合は、Jquery $.extend を使用する必要があります。ここで試すことができます

var basemodel = Backbone.Model.extend({
  defaults:{a:{"1":"1","2":4,"4":5},b:2}
}
);

var model1 = basemodel.extend({
    defaults: $.extend(false,basemodel.prototype.defaults,{a:{"1":1,"2":2},b:{"xx":13}})
});


var model2 = basemodel.extend({
    defaults: $.extend(false,basemodel.prototype.defaults,{a:{"1":1,"2":2},z:13})
});



var m1 = new model1();
var m2 = new model2();


alert(JSON.stringify(m1.toJSON()));
alert(JSON.stringify(m2.toJSON()));

また、作業を正しく行うには、最初のパラメーター「false」を指定する必要があります。true の場合は、互いにインターレースします。

于 2014-11-14T07:22:16.277 に答える