2011-08-08 55 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]; 
     }); 
    }; 
};