大多数模块依赖加载器/管理器本质上都是将这种模块定义封装进一个友好的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)包装函数的返回值必须至少包括一个对内部函数的引用,这样就会创建涵盖整个包装函数内部作用域的闭包。
博客内容展示了如何使用JavaScript实现一个模块管理器,通过`define`和`get`方法定义和获取模块。模块间通过依赖注入实现交互,如获取用户信息、学校信息和兴趣爱好。整个实现基于闭包来保持内部作用域,确保模块的独立性和封装性。
2274

被折叠的 条评论
为什么被折叠?



