-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathextend.html
More file actions
92 lines (83 loc) · 3.16 KB
/
extend.html
File metadata and controls
92 lines (83 loc) · 3.16 KB
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
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<title></title>
</head>
<body>
<script>
function fClass() {
var len = arguments.length;
var body = arguments[len - 1]; // 最后一个参数是指定本身的方法
var SuperClass = len > 1 ? arguments[0] : null; // 第一个参数是指继承的方法,实例和静态部分均继承
var hasImplementClasses = len > 2; // 如果有第三个参数,那么第二个就是implementClass,这里其实只继承实例对象
var Class, SuperClassEmpty;
// 保证构造方法
if (body.constructor === Object) {
Class = function() {};
} else {
Class = body.constructor;
// 保证后面不覆盖constructor
delete body.constructor;
}
// 处理superClass部分
if (SuperClass) {
// 中间件实现实例属性的继承
SuperClassEmpty = function() {};
SuperClassEmpty.prototype = SuperClass.prototype;
Class.prototype = new SuperClassEmpty(); // 原型继承,解除引用
Class.prototype.constructor = Class; // 保证constructor
Class.Super = SuperClass; // 父对象访问接口
// 静态方法继承,重载superClass方法
fExtend(Class, SuperClass, false);
}
// 处理ImplementClass部分,其实只继承实例属性部分,除SuperClass #arguments[0]# 和 body #arguments[length-1]#
if (hasImplementClasses)
for (var i = 1; i < len - 1; i++)
// implement是继承的实例属性部分, 重载父对象implementClass方法
fExtend(Class.prototype, arguments[i].prototype, false);
// 处理本身声明body部分,静态要STATIC指定,实例部分要删除STATIC部分
fExtendClass(Class, body);
return Class;
}
/**
* @method zero.extendClass
* @params Class:function, extension:Object, ?override:boolean=true
*/
function fExtendClass(Class, extension, override) {
// 静态部分继承静态部分
if (extension.STATIC) {
fExtend(Class, extension.STATIC, override);
// 保证实例部分不继承静态方法
delete extension.STATIC;
}
// 实例属性继继承实例部
fExtend(Class.prototype, extension.members, override);
}
/**
* @method zero.fExtend
* @params object,extension,override
*/
function fExtend(obj, extension, override) {
var prop;
// 其实这里的flase是表明,覆盖父对象的方法
if (override === false) {
for (prop in extension){
if (!(prop in obj)){
obj[prop] = extension[prop];
}
}
} else {
// 这里其实不覆盖父对象的方法,包括toString
for (prop in extension){
obj[prop] = extension[prop];
}
if (extension.toString !== Object.prototype.toString)
obj.toString = extension.toString;
}
}
</script>
<script>
</script>
</body>
</html>