Javascript Traits Pattern Resources

时间:2011-08-08 02:23:20

标签: javascript traits

有人可以推荐在javascript中使用特征的好资源吗?经过一些搜索,我主要找到有关提供特征功能的库的文章,但我对如何在没有库的情况下实现特征的最佳实践感到好奇。

我在SO上看过这篇文章,还有其他方法吗? Traits in javascript

任何现实世界的例子都会受到欢迎。

感谢。

5 个答案:

答案 0 :(得分:3)

我会建议一些简单的事情:

  1. 让traits定义为标准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!

答案 1 :(得分:2)

trait.js

中有关特征的一些(有限的)信息

不是关于Javascript,而是关于继承系统和特征“Traits: A Mechanism for Fine-grained Reuse”的好文章。可以在“Applying Traits to the Smalltalk Collection Hierarchy”中找到实现细节的描述。更多此类论文列于this page

答案 2 :(得分:2)

两篇论文确实描述了基于图书馆无关的纯函数,基于Mixin和Trait的JavaScript方法,2011年5月由Angus Croll A fresh look at JavaScript Mixins和2014年4月The many talents of JavaScript for generalizing Role Oriented Programming approaches like Traits and Mixins。{/ p>

这么久

附录I

请参阅:

附录II

由于我不时会对这件事表示不满,我不想添加一些最终的想法...

没有太多胶水代码的库不可知方法(如上所述)仅适用于行为重用的非常精细的可组合单元。因此,只要一个不会遇到超过1或2个易于解决的冲突,基于例如Angus Croll的 Flight Mixins 是要遵循的道路。

如果涉及真实特征,则必须有一个抽象级别。该层(例如,作为某种类型的语法糖提供,如DSL)需要隐藏复杂性,例如根据特征或特征中的冲突解决方法组成特征应用时间(当特征的行为应用于对象/类型时)。

到目前为止,有三个例子,从我的角度来看,确切地提供了OP所要求的......

  

任何现实世界的例子都会受到欢迎。

答案 3 :(得分: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];
        });
    }; 
};

答案 4 :(得分:0)

在npm中有一个简单而轻便的软件包。您可以在此处进行检查,它确实使PHP功能的特性很容易在Javascript上实现。

https://github.com/regs37/trait.js

// create a simple trait that you want to be reusable
const MyTrait = trait({
  sampleTrait: function(){
    return "trait";
  }
})

// lets have a sample class User
class User {

}

// we will inherit the trait to the User Class
MyTrait.in(User);

// sample instance of the user
let user = new User();

// try to call he trait we have inherited
console.log(user.sampleTrait()); // trait
<script src="https://unpkg.com/trait.js@1.2.12/build/trait.min.js"></script>