2011-08-08 47 views
3

任何人都可以推薦在javascript中使用特徵的好資源嗎?經過一番搜索之後,我主要找到有關提供特徵功能的圖書館的文章,但我對如何在沒有圖書館的情況下實施特質的最佳實踐感到好奇。Javascript特徵模式資源

我在這篇文章中遇到過,有沒有其他方法? Traits in javascript

任何現實世界的例子都會受到歡迎。

謝謝。

回答

3

我會建議簡單的東西,沿着線:

  1. 讓特質被定義爲標準的JavaScript對象。

    var equalsTrait = { 
        eq: function(obj) { 
         return this == obj 
        }, 
        neq: function(obj) { 
         return ! this.eq(obj) 
        } 
    }; 
    
  2. 編寫一個函數來擴展一個給定的類與特性(它在全球範圍內綁定到一個合理的位置):

    window.Traits = {}; 
    Traits.addToClass = function(traits, cls) { 
        for (var key in traits) { 
         if (cls.prototype[key]) { 
          alert("Class " + cls + " already has a method named " + key + "!"); 
         } 
         else { 
          cls.prototype[key] = traits[key]; 
         } 
        } 
    } 
    
  3. Profit!

+0

感謝您的例子。因此,從模式的角度來看,你認爲應該滿足哪些標準才能正確執行特徵?特徵是可以由任何對象實現的可重複使用的功能。除此之外還有其他什麼?我在圖書館看到他們處理命名空間衝突。在你的例子中,特徵被複制到每一個創建的實例,它會更好(如果甚至可取的話)在所有實例之間共享特徵? –

2

兩篇論文那些描述庫無關的純函數基於密新和特質,從2011年5月和The many talents of JavaScript for generalizing Role Oriented Programming approaches like Traits and Mixins從2014年4月接近對JavaScript的A fresh look at JavaScript Mixins安格斯·克羅爾

這麼久

附錄I

請參閱:

附錄II

由於不時我顯然這件事情我wan't一些最後的想法添加到它的小提琴......

沒有太多膠合代碼的庫不可知的方法(如上所述)只適用於行爲重用的非常細粒度的可組合單元。因此,只要沒有遇到超過1或2個容易解決的衝突,基於例如安格斯克羅爾的Flight Mixins是遵循的路徑。

如果涉及真正的特徵,那就必須有一個抽象層次。這一層(例如像DSL那樣的某種語法糖提供)需要隱藏複雜性,例如從特徵構成特徵或在特徵上解決衝突適用時間(當特徵的行爲應用於對象/類型時)。

現在有在SO 3個例子,從我的角度提供正是OP沒問...

任何現實世界的例子將受到歡迎,以及。

0

您可以使用功能來實現沒有圖書館的特質。

見工作示例Traits + Inheritance

由於dbarbeau

// Usage __traits(TargetClass, Trait1, Trait2, ...); 
// Mix multiple definitions as traits. Properties will be overwritten if names are duplicating. 
function __traits(mixtureTarget) { 
    for(var a=1; a < arguments.length; ++a) { 
     var mixin = arguments[a]; 
     for (var p in mixin){ if (mixin.hasOwnProperty(p)){ mixtureTarget[p] = mixin[p]; } }; 
     Object.getOwnPropertyNames(mixin.prototype).forEach(function(name) { 
      mixtureTarget.prototype[name] = mixin.prototype[name]; 
     }); 
    }; 
};