-
Notifications
You must be signed in to change notification settings - Fork 3
/
sanbox.js
101 lines (86 loc) · 2.21 KB
/
sanbox.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
/**
* 对象创建模式:命名空间模式 + 依赖声明模式、沙箱模式、method()方法
*/
/*
* 沙箱模式
*/
function Sandbox() {
// 将参数转换为数组
var args = Array.prototype.slice.call(arguments),
// 最后一个参数是回调函数
callback = args.pop(),
// 参数可以作为数组或者单独的参数传递
modules = (args[0] && typeof args[0] === "string") ? args : args[0],
i;
// 保证函数是作为构造函数被调用
if (!(this instanceof Sandbox)) {
return new Sandbox(modules, callback);
}
// 根据需要给this添加属性
this.a = 1;
this.b = 2;
// 给this对象添加模块
// 未指明模块或者*都表示“使用所有模块”
if (!modules || modules[0] === '*') {
modules = [];
for (i in Sandbox.modules) {
if (Sandbox.modules.hasOwnProperty(i)) {
modules.push(i);
}
}
}
// 初始化指定的模块
for (i = 0; i < modules.length; i += 1) {
Sandbox.modules[modules[i]](this);
}
// 调用回调函数
callback(this);
}
// 需要添加在原型上的属性
Sandbox.prototype = {
name: "My Application",
version: "1.0",
getName: function() {
return this.name;
}
};
// 添加模块
Sandbox.modules = {};
Sandbox.modules.dom = function(box) {
box.getElement = function() {};
box.getStyle = function() {};
box.foo = "bar";
};
Sandbox.modules.event = function(box) {
// 如果有需要的话可以访问Sandbox的原型
// box.constructor.prototype.m = "mmm";
box.attachEvent = function() {};
box.dettachEvent = function() {};
};
Sandbox.modules.ajax = function(box) {
box.makeRequest = function() {};
box.getResponse = function() {};
};
// demo
// 使用沙箱模式
new Sandbox(function(box) {
// 你的代码……
});
Sandbox(['ajax', 'event'], function(box) {
// console.log(box);
});
Sandbox('dom', 'event', function(box) {
// 使用dom和event模块
Sandbox('ajax', function(box) {
// 另一个沙箱中的box,这个box和外面的box不一样
//...
// 使用ajax模块的代码到此为止
});
// 这里的代码与ajax模块无关
});
Sandbox('*', function(box) {
// console.log(box);
});
Sandbox(function(box) {
// console.log(box);
});