Javascript trait模式资源

Javascript Traits Pattern Resources

本文关键字:资源 模式 trait Javascript      更新时间:2023-09-26

谁能推荐在javascript中使用性状的好资源?经过一番搜索,我主要找到了关于提供trait功能的库的文章,但我对如何在没有库的情况下实现trait的最佳实践很感兴趣。

我在SO上看到了这篇文章,有没有其他的方法?javascript中的Traits

任何真实世界的例子都是受欢迎的。

谢谢。

我的建议很简单,比如:

  1. 让trait被定义为标准的JavaScript对象。

    var equalsTrait = {
        eq: function(obj) {
            return this == obj
        },
        neq: function(obj) {
            return ! this.eq(obj)
        }
    };
    
  2. 编写一个函数,用你的trait扩展一个给定的类(并将其绑定到全局作用域中一个合理的位置):

    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. 利润!

trait.js库中的一些(有限的)特征信息

不是关于Javascript的,而是一篇关于继承系统和特性的好论文"traits: a Mechanism for Fine-grained Reuse"。实现细节的描述可以在"将trait应用到Smalltalk集合层次结构"中找到。此页列出更多此类论文

两篇描述JavaScript基于库无关的纯函数Mixin和Trait方法的论文是2011年5月Angus Croll的《JavaScript Mixins的新视角》和2014年4月的《JavaScript在推广面向角色的编程方法(如Traits和Mixins)方面的许多天赋》。

这么长时间

附录

请参见:

    stackoverflow.com:: Traits in javascript如何在Javascript中正确使用mixins
附录II

由于我显然不时地在摆弄这件事,所以我不想对它添加一些最后的想法。

没有太多粘合代码的库不可知方法(如上所述)只适用于非常细粒度的行为重用可组合单元。因此,只要不遇到超过1或2个容易解决的冲突,基于Angus Croll的Flight Mixins的模式是可以遵循的路径。

如果涉及到真实的特征,就必须有一个抽象层次。这一层(例如,作为某种语法糖,如DSL)需要隐藏复杂性,例如,从特征中组合特征或在特征应用时解决冲突(当特征的行为被应用到对象/类型时)。

到目前为止,在SO中有3个例子,从我的角度来看,提供了OP确实要求的…

任何真实世界的例子都是受欢迎的。

    JS中的composition and mixins
  • stackoverflow.com:: ES6类的Mixins,用babel编译
  • stackoverflow.com::重构旧的基于混合的类层次结构
  • stackoverflow.com::使用类进行多重继承

你可以使用function来实现trait,而不需要库。

参见工作示例Traits + Inheritance

Thanks to 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];
        });
    }; 
};

在NPM中有一个简单且轻量级的包。你可以在这里查看,它确实使trait from 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>