The Mixin Pattern
不透過繼承的方式,將其它物件的部分 method 「拿來使用」。此模式主要目的是「程式碼重用」。但也因為如此,會讓物件關係變得比較混亂。因此,如果沒有必要,這模式最好少使用。可能的使用時機是,「除錯」或是,太複雜的原程式碼只能透過借用的方式處理。使用 underscorejs 的 extend
// 要被「借用method」的物件 var myMixins = { moveUp: function(){ /* ... */ }, moveDown: function(){ /* ... */ }, stop: function(){ /* ... */ } }; // 借用方 function CarAnimator(){ this.moveLeft = function(){ /* ... */ }; } // 將 myMixins 的方法給借用方 _.extend( CarAnimator.prototype, myMixins ); var myAnimator = new CarAnimator(); // 使用「借用」的method myAnimator.moveLeft(); myAnimator.moveDown(); myAnimator.stop();
另外此部分有提供只借用部分method的方式,但將欲借用的method,當作第三個參數以後傳入。可是這個function只有定義兩個參數,雖然javascript可以用這樣的方式來接收「多」出來的參數作處理,但最好還是定義第三個參數,直接處理比較好。免得日後還要猜第三個未定義的參數,到底是什麼意思。
// t: targetClass, s:sourceClass, m:methods array function augment(t, s, m) { // 只需部分 methods if (m) { for (var i=0; i < m.length; i++ ) { t.prototype[m[i]] = s.prototype[m[i]]; } } // 將 s 的 all methods 傳給 t else { for (var mName in s.prototype ) { if ( !Object.hasOwnProperty.call(t.prototype, methodName) ) { t.prototype[mName] = s.prototype[methodName]; } } } } // 使用方式 augment(target, source, ["methodA", "methodB"]); augment(target, source);