Page 69 - 你不知道的JavaScript(上卷)
P. 69

foo1.identify(); // "foo 1"
                   foo2.identify(); // "foo 2"
               模块模式另一个简单但强大的变化用法是,命名将要作为公共 API 返回的对象:

                   var foo = (function CoolModule(id) {
                       function change() {
                           // 修改公共 API
                           publicAPI.identify = identify2;
                       }

                       function identify1() {
                           console.log( id );
                       }

                       function identify2() {
                           console.log( id.toUpperCase() );
                       }

                       var publicAPI = {
                           change: change,
                           identify: identify1
                       };

                       return publicAPI;
                   })( "foo module" );

                   foo.identify(); // foo module
                   foo.change();
                   foo.identify(); // FOO MODULE

               通过在模块实例的内部保留对公共 API 对象的内部引用,可以从内部对模块实例进行修
               改,包括添加或删除方法和属性,以及修改它们的值。

               5.5.1 现代的模块机制

               大多数模块依赖加载器 / 管理器本质上都是将这种模块定义封装进一个友好的 API。这里
               并不会研究某个具体的库,为了宏观了解我会简单地介绍一些核心概念:

                   var MyModules = (function Manager() {
                       var modules = {};

                       function define(name, deps, impl) {
                           for (var i=0; i<deps.length; i++) {
                               deps[i] = modules[deps[i]];
                           }
                           modules[name] = impl.apply( impl, deps );
                       }

                       function get(name) {
                           return modules[name];
                       }


               54   |   第 5 章
   64   65   66   67   68   69   70   71   72   73   74