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