[英]ES 6 Classes - Mixins
我提出了View(HTML标记)和Utility(JavaScript-behavior)体系结构,并创建了原子类,以使用ES6 Class来组成视图和实用程序。 可能需要将多个实用程序类组成/混合到单个视图类中。
ES6类API如何提供一种将类混入另一个/主类的方法。 我看过Object.assign
但这是针对对象的,而不是针对类级别的。
现在和希望将来的JavaScript类只能相互扩展,不能相互混合。 如果有的话,那么很可能有一天轻量级特征确实成为了规范。
它的体系结构方法特定于JavaScript。 在过去的几年中,它经常被提及... esdiscuss.org: “关于轻量级特征” ,github.com/WebReflection: »功能::与« ,webreflection.blogspot.com: »未来友好,向后兼容,类实用程序« ,reddit.com/r/javascript: »ECMAScript 2015中的功能混音« ,raganwald.com: »ECMAScript 2015中的功能混音« ...与安格斯·克罗尔(Angus Croll)的Flight Mixins相比可能是最好的。
基于纯函数的Mixin / Trait方法... 这不是关于“ Java特质”的文章,JavaScript 的许多“才干” ...确实接近OP的要求,除非类似...
// proposed trait syntax ... // ... desugared e.g. to ...
trait Enumerable_first_last { // var Enumerable_first_last = (function () {
// trait body. // // mixin module.
//
const // var
FIRST = function () { // first = function () { // shared code.
return this[0]; // return this[0];
}, // },
LAST = function () { // last = function () {
return this[this.length - 1]; // return this[this.length - 1];
} // }
; // ;
//
applicator () { // return function Enumerable_first_last () {
// applicator body. // // mixin body.
//
this.first = FIRST; // this.first = first; // referencing ...
this.last = LAST; // this.last = last; // ... shared code.
} // };
//
} // }());
...
// proposed trait syntax ... // ... desugared e.g. to ...
trait Enumerable_item { // var Enumerable_item = (function () {
//
const // var
ITEM = function (idx) { // item = function (idx) {
return this[ // return this[
Math.floor( // Math.floor(
parseFloat(idx, 10) // parseFloat(idx, 10)
) // )
]; // ];
} // }
; // ;
//
applicator () { // return function Enumerable_item () {
//
this.item = ITEM; // this.item = item;
} // };
//
} // }());
...
// proposed trait syntax ... // ... desugared e.g. to ...
trait Enumerable_first_last_item { // var Enumerable_first_last_item = (function () {
//
use Enumerable_first_last; // return function Enumerable_first_last_item() {
use Enumerable_item; //
/* // Enumerable_first_last.call(this);
applicator () { // Enumerable_item.call(this);
// can be omitted if empty. // };
}*/ //
} // }());
...
// ... desugared e.g. to ...
//
class Queue { // var Queue = (function () {
//
//use Allocable; // return function Queue () {
use Observable; // var list = [];
//
constructor () { // this.enqueue = function (type) {
const list = []; //
// list.push(type);
this.enqueue = function (type) { // return type;
// };
list.push(type); // this.dequeue = function () {
return type; //
}; // return list.shift();
this.dequeue = function () { // };
//
return list.shift(); // //Allocable.call(this, ...);
}; // Observable.call(this);
} // };
//
} // }());
//
var q = new Queue; // var q = new Queue;
//
q.enqueue(9); // q.enqueue(9);
q.enqueue(8); // q.enqueue(8);
q.enqueue(7); // q.enqueue(7);
//
console.log(q.dequeue()); // console.log(q.dequeue());
console.log(q.dequeue()); // console.log(q.dequeue());
console.log(q.dequeue()); // console.log(q.dequeue());
//
console.log(q); // console.log(q);
console.log(Object.keys(q)); // console.log(Object.keys(q));
...被运到ECMAScript土地。
ES2015类有一个非常不错的模式(我不一定认可),可以通过Sebastian Markbage创建mixin,我对此做了一些改动。
实用程序功能mixinClasses
可用于将类工厂(又称返回类的工厂函数)混合到新类中:
function mixinClasses(...mixins) {
// TODO: Add all possible method names that might call super()
// to the base class so that they don't throw.
return mixins.reduce((base, mixin) => {
return mixin(base);
}, class {});
}
可以如下使用,例如,使用两个工厂函数Foo
和Bar
:
const Foo = base => class extends base {
myFn() {
}
};
const Bar = base => class extends base {
myFn() {
super.myFn();
}
};
class Baz extends mixinClasses(Foo, Bar) {
myFn() {
super.myFn();
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.