模块机制API记录

博客内容展示了如何使用JavaScript实现一个模块管理器,通过`define`和`get`方法定义和获取模块。模块间通过依赖注入实现交互,如获取用户信息、学校信息和兴趣爱好。整个实现基于闭包来保持内部作用域,确保模块的独立性和封装性。

大多数模块依赖加载器/管理器本质上都是将这种模块定义封装进一个友好的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];
        }
        return{
                define:define,
                get:get
        }
})()

引用示例
方法一:获取用户 姓名 身高 年龄
方法二:扩展 获取用户的班级 学号
方法三:扩展 获取用户的兴趣

MyModules.define('userInfo',[],function(){
        function name(name){
            console.log("用户姓名"+name)
            return "111"
        }
        function sg(sg){
            console.log("用户身高"+sg)               
        }
        function age(age){
            console.log("用户年龄"+age)               
        }
        return{
                name:name,
                sg:sg,
                age:age
        }
})
MyModules.define("schollInfo",["userInfo"],function(userInfo){
        function classes(classes){
                console.log("用户班级"+classes)  
                return userInfo.name("张三")              
        }
        function classesNumber(classesNumber){
                console.log("用户学号"+classesNumber)                  
        }
        return{
                classes:classes,
                classesNumber:classesNumber
        }
})
MyModules.define('hobby',['userInfo','schollInfo'],function(userInfo,schollInfo){
        function licks(licks){
                console.log("用户喜欢"+licks)          
        }
        function classesNumber(classesNumber){
                schollInfo.classesNumber(classesNumber)
        }
        function classes(classes){
                schollInfo.classes(classes)
        }
        function age1(age){
                userInfo.age(age)
        }
        return{
                licks:licks,
                classesNumber:classesNumber,
                classes:classes,
                age1:age1,
        }
})
var user=MyModules.get('userInfo')
var schollInfo=MyModules.get('schollInfo')
var hobby=MyModules.get('hobby')
hobby.licks("游泳");
hobby.classesNumber("001");
hobby.classes("七年级三班");
hobby.age1("22");

调用包装了函数定义的包装函数,并且将返回值作为该模块的API。换句话说,模块就是模块,即使在它们外层加上一个友好的包装工具也不会发生任何变化。

模块有两个主要特征:(1)为创建内部作用域而调用了一个包装函数;(2)包装函数的返回值必须至少包括一个对内部函数的引用,这样就会创建涵盖整个包装函数内部作用域的闭包。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值