2016-06-15 11 views
0

「ミックスインパターン」に基づいてサンプルコードを作成します。ミックスインパターンアンダースコア、_.extendキーワードを使用

私は以下のようなコードを持っています。

define(["jquery","underscore", "backbone"], function($, _,Backbone) { 

//Mixin : 
// 
/* Sometimes you have the same functionality for multiple objects 
*  and it doesn’t make sense to wrap your objects in a parent object. 
* For example, if you have two views that share methods but don’t 
*  – and shouldn’t – have a shared parent view. 
*/ 

//I can define an object that has attributes and methods that can be shared across different classes. 
//This is called a mixin. 

//Mixin Object 
var C = Backbone.Model.extend({ 
    c: function() { 
     console.log("We are different but have C-Method shared"); 
    } 
}); 

//To be Mixin-ed Object-1 
var A = Backbone.Model.extend({ 
    a: 'A', 
}); 

//To be Mixin-ed Object-2 
var B = Backbone.Model.extend({ 
    b: 'B' 
}); 

//underscore 
_.extend(A.prototype, C); 
_.extend(B.prototype, C); 

return Backbone.Model.extend({ 
    initialize: function(){ 
     var testA = new A(); 
     testA.c(); 
     var testB = new B(); 
        testA.c(); 

    } 
}); 
}); 

このコードを実行すると、 'testA.cは関数ではありません'というエラーが表示されます。 私が研究したいくつかのコード例で判断すると、これはうまくいくはずです。 このコードが可能な限り詳細に機能しない理由について教えてください。

+0

'_c'プロパティを定義しましたが、' c'( 'testA.c()')を呼び出しました。私は彼らが同じであるべきだと思う。 –

+0

私はそれを変更...しかし、同じエラーの下で動作しません。別の理由があると思う。 –

答えて

2

C.prototypeのプロパティ(cが実際に定義されている場所)ではなく、Cのプロパティをコピーするという問題があります。

_.extend(A.prototype, C); 
_.extend(B.prototype, C); 

へ:単に変更

_.extend(A.prototype, C.prototype); 
_.extend(B.prototype, C.prototype); 

と期待通りにすべてが動作します。

+0

これは私の期待どおりに動作します。ありがとう! –