##// END OF EJS Templates
added djbase mixins declaration support
cin -
r32:1174538197f6 v1.0.0-rc15 default
parent child
Show More
@@ -5,5 +5,9
5 5 "**/.project": true,
6 6 "**/.settings": true,
7 7 "**/.factorypath": true
8 }
8 },
9 "cSpell.words": [
10 "djbase",
11 "djclass"
12 ]
9 13 } No newline at end of file
@@ -859,6 +859,12
859 859 "integrity": "sha512-lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==",
860 860 "dev": true
861 861 },
862 "requirejs": {
863 "version": "2.3.6",
864 "resolved": "https://registry.npmjs.org/requirejs/-/requirejs-2.3.6.tgz",
865 "integrity": "sha512-ipEzlWQe6RK3jkzikgCupiTbTvm4S0/CAU5GlgptkN5SO6F3u0UD0K18wy6ErDqiCyP4J4YYe1HuAShvsxePLg==",
866 "dev": true
867 },
862 868 "resolve": {
863 869 "version": "1.17.0",
864 870 "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
@@ -29,6 +29,7
29 29 "eslint": "6.8.0",
30 30 "tslint": "^6.1.3",
31 31 "typescript": "4.0.2",
32 "yaml": "~1.7.2"
32 "yaml": "~1.7.2",
33 "requirejs": "2.3.6"
33 34 }
34 35 }
@@ -14,11 +14,11 export interface AbstractConstructor<T =
14 14 interface DjMockConstructor<T = {}> {
15 15 new(...args: any[]): T;
16 16 mock: boolean;
17 base: AbstractConstructor;
17 bases: AbstractConstructor[];
18 18 }
19 19
20 20 export function djbase<T>(
21 b0: AbstractConstructor<T>
21 b0?: AbstractConstructor<T>
22 22 ): DeclareConstructor<T>;
23 23
24 24 export function djbase<T0, T1>(
@@ -96,11 +96,11 export function djbase(...bases: any[]):
96 96
97 97 const t = class {
98 98 static mock: boolean;
99 static base: AbstractConstructor;
99 static bases: AbstractConstructor[];
100 100 };
101 101
102 102 t.mock = true;
103 t.base = declare(bases);
103 t.bases = bases;
104 104
105 105 return t as any;
106 106 }
@@ -122,7 +122,9 export function djclass<T extends Abstra
122 122 // проверка того, что класс унаследован от специальной заглушки
123 123 if (isMockConstructor(bc)) {
124 124 // t - базовый класс, объявленный при помощи dojo/_base/declare
125 const t = bc.base;
125 const t = bc.bases;
126
127 const cls = declare(bc.bases, target.prototype);
126 128
127 129 // bc - базовый класс, bc.prototype используется как super
128 130 // при вызове базовых методов. Нужно создать bc.prototype
@@ -132,7 +134,7 export function djclass<T extends Abstra
132 134 // класса, но super.some_method будет использовать именно его.
133 135 // в этом объекте будут размещены прокси для переопределенных
134 136 // методов.
135 bp = bc.prototype = Object.create(t.prototype);
137 bp = bc.prototype = Object.create(cls.prototype);
136 138 bp.constructor = bc;
137 139
138 140 // proxy - фабрика для создания прокси-методов, которые внутри
@@ -153,14 +155,12 export function djclass<T extends Abstra
153 155 each(target.prototype, (m: any, p: string | number | symbol) => {
154 156 if (typeof m === "function" &&
155 157 p !== "constructor" &&
156 target.prototype.hasOwnProperty(p) &&
157 p in t.prototype
158 target.prototype.hasOwnProperty(p)
158 159 ) {
159 160 bp[p] = proxy(m);
160 161 }
161 162 });
162 163
163 const cls = declare(t, target.prototype);
164 164 // TODO mixin static members
165 165 return cls as any;
166 166 } else {
General Comments 0
You need to be logged in to leave comments. Login now