简化了一下 YUI3 中的沙箱实现 方式:
if (typeof Sandbox === 'undefined' || !Sandbox) {
Sandbox = function(o) {
var self = this;
if (!(self instanceof Sandbox)) { // 允许没有 new 操作符的实例化
return new Sandbox(o);
} else {
self._init();
self._config(o);
// 预加载某些指定模块
/* self._setup(); */
// 返回实例本身,支持链式模式
return self;
}
};
}
// Sandbox的(类)静态属性
Sandbox.Env = {
/* sidx: 0 , */
mods: {}
};
(function() {
var p, i,
SLICE = Array.prototype.slice,
/* instances = {}, */
time = new Date().getTime(),
win = window,
doc = document;
Sandbox.prototype = {
// 格式化配置参数
// NOTE:本着简单适用的原则,取消了原先 YUI 中对 loader 的支持
_config: function(o) {
var c = this.config, i, j, m, mods;
o = o || {};
// mods = c.modules;
for (i in o) {
if (i == 'win') {
c[i] = o[i].contentWindow || o[i];
c.doc = c[i].document;
} else {
c[i] = o[i];
}
}
},
/**
* 初始化沙箱实例
* @private
*/
_init: function() {
var self = this,
G_Env = Sandbox.Env,
Env = self.Env;
if(!Env) {
self.Env = {
mods: {},
_used: {},
_attached: {},
_loaded: {}
};
Env = self.Env;
/* if (G_Env && self !== Sandbox ) {
Env._sidx = ++ G_Env.sidx;
Env._guid = ('sandbox_' + Env._sidx + '_' + time).replace(/\./g, '_');
}
self.id = Env._guid;
instances[self.id] = self; */
}
self.constructor = Sandbox;
self.config = {
win: win || {},
doc: doc || {}
};
},
// 预留预加载某些指定模块,接口可根据实际需要扩展
/* _setup: function(o) {}, */
/**
* 添加模块
* @method add
* @param name {string} 模块名
* @param fn {Function} 模块对应的函数
* @param version {string}
* @param details 可选配置:
* requires - {array} 在本模块执行之前附加的必须的模块数组
* use - {array} 在本模块执行之后附加的模块数组
*
*/
add: function(name, fn, details) {
Sandbox.Env.mods[name] = {
name: name,
fn: fn,
details: details || {}
};
return this; // chain support
},
/**
* 执行与 Sandbox 实例相关联的模块:details.requires--》fn--》details.use
* @method _attach
* @param r {array} 模块列表数组
* @private
*/
_attach: function(r) {
var mods = Sandbox.Env.mods,
self = this,
attached = self.Env._attached,
i, l = r.length, name, m, fn, d, req, use;
for (i = 0; i