2016-06-15 15 views
0

Ich möchte einen Beispielcode basierend auf 'Mixin Pattern' machen.Mixin Pattern mit Unterstrich, _.extend Schlüsselwort

Ich habe einen Code wie folgt.

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(); 

    } 
}); 
}); 

Wenn ich diesen Code ausführen, kommt es eine Fehlermeldung, ‚testA.c ist keine Funktion‘. Nach einigen Beispielcodes zu urteilen, die ich studierte, sollte dies funktionieren. Können Sie mich bitte über den Grund informieren, warum dieser Code nicht so detailliert wie möglich funktioniert?

+0

Sie haben '_c' definiert, aber Sie rufen' c' ('testA.c()') auf. Ich denke, sie sollten gleich sein. –

+0

Ich habe es geändert ... aber es funktioniert nicht unter dem gleichen Fehler. Ich denke, es gibt einen anderen Grund. –

Antwort

2

Ihr Problem ist, dass Sie die Eigenschaften von C anstelle der Eigenschaften von C.prototype kopieren (wo die Methode c tatsächlich definiert ist). Einfach ändern:

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

zu:

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

und alles wird wie erwartet.

+0

Es funktioniert wie ich es erwartet hatte. Vielen Dank! –