Псевдоклассы var ClassName Class Extends Класс _от_которого_наследо ва

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
/*
Псевдоклассы.
var ClassName = Class({
Extends: Класс,_от_которого_наследовать,
Static: { статические поля класса, доступ через Класс.ПОЛЕ },
Constructor: function () { конструктор },
Implements: { классы, с которых скопировать методы },
...методы...
});
Вызов парентного конструктора:
ParentClass.apply(this, ...);
Вызов парентого метода:
ParentClass.method.apply(this, ...)
*/
(function () {
window.Class = function (opts) {
opts = opts || {};
var noop = function () { };
var new_class = function () {
if (new_class.prototype.Constructor) {
new_class.prototype.Constructor.apply(this, arguments);
} else {
if (new_class.$parent)
new_class.$parent.apply(this, arguments);
}
};
new_class.prototype = {constructor: new_class};
if (opts.Static) {
if (opts.Extends)
_extend_static(new_class, opts.Extends);
extend(new_class, opts.Static);
delete opts.Static;
}
var extended = false;
if (opts.Extends) {
new_class.$parent = opts.Extends;
new_class.prototype.$parent = opts.Extends;
extend(new_class.prototype, opts.Extends.prototype);
delete opts.Extends;
extended = true;
}
delete new_class.prototype.Constructor;
extend(new_class.prototype, opts);
if (opts.Implements) {
for (var i = 0; i < opts.Implements.length; ++i) {
var o = opts.Implements[i];
_extend_static(new_class.prototype, 'prototype' in o ? o.prototype : o);
}
delete opts.Implements;
}
return new_class;
};
function _extend_static(obj, static_vars) {
for (var k in static_vars) {
if (!isOwnProp.call(static_vars, k) || (obj[k] !== undefined && !isOwnProp.call(obj, k)) || k == 'prototype' || k == '$parent')
continue;
obj[k] = static_vars[k];
}
return obj;
}
})();