new Sandbox(function (box) { // your code here... });对象box和命名空间模式里面的MYAPP比较像,它将会拥有让你代码运行需要的所有类库功能函数。
Sandbox(['ajax', 'event'], function (box) { // console.log(box); });这个例子和前面的类似,但这一次模块名是作为独立的参数传递的:
Sandbox('ajax', 'dom', function (box) { // console.log(box); });那么使用通配符 * 参数表示"所有可用的模块"怎么样?方便起见,让我们假设当没有模块被传递,沙盒会假设 * .
Sandbox('*', function (box) { // console.log(box); }); Sandbox(function (box) { // console.log(box); });还有一个例子可以说明如何多次实例化沙盒对象,并且你甚至可以一个中嵌套在另一个而没有干扰:
Sandbox('dom', 'event', function (box) { // work with dom and event Sandbox('ajax', function (box) { // another sandboxed "box" object // this "box" is not the same as // the "box" outside this function //... // done with Ajax }); // no trace of Ajax module here });就想你在这些例子中看到的,当使用沙盒模式时,你可以将你的代码包裹进回调函数保护全局的命名空间。
Sandbox.modules = {}; Sandbox.modules.dom = function (box) { box.getElement = function () {}; box.getStyle = function () {}; box.foo = "bar"; }; Sandbox.modules.event = function (box) { // access to the Sandbox prototype if needed: // box.constructor.prototype.m = "mmm"; box.attachEvent = function () {}; box.dettachEvent = function () {}; }; Sandbox.modules.ajax = function (box) { box.makeRequest = function () {}; box.getResponse = function () {}; };在这个例子中,我们添加了模块dom,event和ajax,都是一些在任何类库或复杂的web项目中常见的基础功能函数。
function Sandbox() { // turning arguments into an array var args = Array.prototype.slice.call(arguments), // the last argument is the callback callback = args.pop(), // modules can be passed as an array or as individual parameters modules = (args[0] && typeof args[0] === "string") ? args : args[0], i; // make sure the function is called // as a constructor if (!(this instanceof Sandbox)) { return new Sandbox(modules, callback); } // add properties to `this` as needed: this.a = 1; this.b = 2; // now add modules to the core `this` object // no modules or "*" both mean "use all modules" if (!modules || modules === '*') { modules = []; for (i in Sandbox.modules) { if (Sandbox.modules.hasOwnProperty(i)) { modules.push(i); } } } // initialize the required modules for (i = 0; i < modules.length; i += 1) { Sandbox.modules[modules[i]](this); } // call the callback callback(this); } // any prototype properties as needed Sandbox.prototype = { name: "My Application", version: "1.0", getName: function () { return this.name; } };在这个实现的重点: