有人可以推荐在javascript中使用特征的好资源吗?经过一些搜索,我主要找到有关提供特征功能的库的文章,但我对如何在没有库的情况下实现特征的最佳实践感到好奇。
我在SO上看过这篇文章,还有其他方法吗? Traits in javascript
任何现实世界的例子都会受到欢迎。
感谢。
答案 0 :(得分:3)
我会建议一些简单的事情:
让traits定义为标准JavaScript对象。
var equalsTrait = {
eq: function(obj) {
return this == obj
},
neq: function(obj) {
return ! this.eq(obj)
}
};
编写一个函数来扩展具有特征的给定类(并将其绑定到全局范围内的合理位置):
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];
}
}
}
答案 1 :(得分:2)
不是关于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>