1 |
|
2 |
|
3 |
|
4 |
|
5 |
|
6 |
|
7 |
|
8 |
|
9 |
|
10 |
|
11 |
|
12 |
|
13 | export const mixin = (behaviour, sharedBehaviour = {}) => {
|
14 | const instanceKeys = Reflect.ownKeys(behaviour);
|
15 | const sharedKeys = Reflect.ownKeys(sharedBehaviour);
|
16 | const typeTag = Symbol("isa");
|
17 | function _mixin(clazz) {
|
18 | for (let key of instanceKeys) {
|
19 | const existing = Object.getOwnPropertyDescriptor(clazz.prototype, key);
|
20 | if (!existing || existing.configurable) {
|
21 | Object.defineProperty(clazz.prototype, key, {
|
22 | value: behaviour[key],
|
23 | writable: true,
|
24 | });
|
25 | }
|
26 | else {
|
27 |
|
28 | }
|
29 | }
|
30 | Object.defineProperty(clazz.prototype, typeTag, { value: true });
|
31 | return clazz;
|
32 | }
|
33 | for (let key of sharedKeys) {
|
34 | Object.defineProperty(_mixin, key, {
|
35 | value: sharedBehaviour[key],
|
36 | enumerable: sharedBehaviour.propertyIsEnumerable(key),
|
37 | });
|
38 | }
|
39 | Object.defineProperty(_mixin, Symbol.hasInstance, {
|
40 | value: (x) => !!x[typeTag],
|
41 | });
|
42 | return _mixin;
|
43 | };
|