-
Notifications
You must be signed in to change notification settings - Fork 0
/
jquery.inherit.js
124 lines (105 loc) · 2.96 KB
/
jquery.inherit.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
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/**
* Inheritance plugin
*
* Copyright (c) 2010 Filatov Dmitry (alpha@zforms.ru)
* Dual licensed under the MIT and GPL licenses:
* http://www.opensource.org/licenses/mit-license.php
* http://www.gnu.org/licenses/gpl.html
*
* @version 1.3.2.M
*/
(function($) {
var hasIntrospection = (function(){_}).toString().indexOf('_') > -1,
needCheckProps = $.browser.msie, // fucking ie hasn't toString, valueOf in for
specProps = needCheckProps? ['toString', 'valueOf'] : null,
emptyBase = function() {};
function override(base, result, add) {
var hasSpecProps = false;
if(needCheckProps) {
var addList = [];
$.each(specProps, function() {
add.hasOwnProperty(this) && (hasSpecProps = true) && addList.push({
name : this,
val : add[this]
});
});
if(hasSpecProps) {
$.each(add, function(name) {
addList.push({
name : name,
val : this
});
});
add = addList;
}
}
$.each(add, function(name, prop) {
if(hasSpecProps) {
name = prop.name;
prop = prop.val;
}
if($.isFunction(base[name]) && $.isFunction(prop) &&
(!hasIntrospection || prop.toString().indexOf('.__base') > -1)) {
var baseMethod = base[name];
result[name] = function() {
var baseSaved = this.__base;
this.__base = baseMethod;
var result = prop.apply(this, arguments);
this.__base = baseSaved;
return result;
};
}
else {
result[name] = prop;
}
});
}
$.inherit = function() {
var withMixins = $.isArray(arguments[0]),
hasBase = $.isFunction(arguments[0]) || withMixins,
base = hasBase? withMixins? arguments[0][0] : arguments[0] : emptyBase,
props = arguments[hasBase? 1 : 0] || {},
staticProps = arguments[hasBase? 2 : 1],
result = props.__constructor || (hasBase && base.prototype.__constructor)?
function() {
this.__constructor.apply(this, arguments);
} : function() {};
if(!hasBase) {
result.prototype = props;
result.prototype.__self = result.prototype.constructor = result;
return $.extend(result, staticProps);
}
var inheritance = function() {},
basePtp = base.prototype;
inheritance.prototype = base.prototype;
result.prototype = new inheritance();
var resultPtp = result.prototype;
resultPtp.__self = resultPtp.constructor = result;
$.extend(result, base);
override(basePtp, resultPtp, props);
staticProps && override(base, result, staticProps);
if(withMixins) {
var i = 1, mixins = arguments[0], mixin, __constructors = [];
while(mixin = mixins[i++]) {
$.each(mixin.prototype, function(propName) {
if(propName == '__constructor') {
__constructors.push(this);
}
else if(propName != '__self') {
resultPtp[propName] = this;
}
});
}
if(__constructors.length > 0) {
resultPtp.__constructor && __constructors.push(resultPtp.__constructor);
resultPtp.__constructor = function() {
var i = 0, __constructor;
while(__constructor = __constructors[i++]) {
__constructor.apply(this, arguments);
}
};
}
}
return result;
};
})(jQuery);