-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathindex.js
98 lines (83 loc) · 2.42 KB
/
index.js
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
/* .#.
@@@@@
@@@@@
@
.....@@@
.@@@@@@@
@@@@@@@
@@@@@@@:@@@..@@@@@@@ @@@ @@@ @@@@@@@@ @@@@@@@ @@@@
.@@@@@@@@ @@@@@@@@ @@@ @@@ @@@@@@@@@ @@@@@@@@@ @@@@@@@@
'@@@@@@@@@@@@@@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@ @@@
:@@@@@@@@@: @@@@@@@@ @@@ @@@ @@@@@@@@@ @@@@@@@@@ @@@ @@@
`@@@@: @@@ @@@ @@@ @@@#@@@ @@@@@@@@ @@@@@@@@@@
@@@ @@@@@@@@@ @@@@@@@@' @@@ @@@ @@@ @@@ @@@
+##` @@@@@@@@ @@@@@ @@@ @@@ @@@ @@@ @@@
Supra
NodeJS
Developer
Friendly
Framework.
*/
(function (root, supraClass) {
'use strict';
function forEachProp (obj, callback, thisArg) {
var name, value;
for (name in obj) {
if (obj.hasOwnProperty(name)) {
value = obj[name];
callback.call(thisArg || value, value, name, obj);
}
}
}
function applySuperMethod (fn, sup) {
return function () {
var prev, result;
prev = this.super;
this.super = sup;
result = fn.apply(this, arguments);
this.super = prev;
if (typeof this.super === 'undefined') {
delete this.super;
}
return result;
};
}
/**
* Base class
*/
function Class () {}
/**
* Extend method
* @param {object} props [Sub-Class Definition]
* @return {obect} [Sub-Class]
*/
Class.extend = function (props) {
var Parent = this;
var extendingFlag = '*extending*';
var proto;
// Extension
Parent[extendingFlag] = true;
proto = new Parent();
delete Parent[extendingFlag];
// Add new properties
forEachProp(props, function (value, name) {
if ( typeof value === 'function') {
proto[name] = applySuperMethod(value, Parent.prototype[name]);
return;
}
proto[name] = value;
});
// Construct
function Class () {
if (!Class[extendingFlag]) {
proto.init.apply(this, arguments);
}
}
Class.prototype = proto;
Class.prototype.constructor = Class;
Class.extend = Parent.extend;
return Class;
};
supraClass.Class = Class;
module.exports = supraClass;
} (this, {}));