Javascript 模块设计模式封装
给定模块设计模式中的代码:Javascript 模块设计模式封装,javascript,module,modular-design,Javascript,Module,Modular Design,给定模块设计模式中的代码: var HTMLChanger=(函数(){ var contents='contents' var changeHTML=函数(){ var元素=document.getElementById('attribute-to-change'); element.innerHTML=内容; } 返回{ callChangeHTML:function(){ changeHTML(); 控制台日志(内容); } }; })(); HTMLChanger.callChange
var HTMLChanger=(函数(){
var contents='contents'
var changeHTML=函数(){
var元素=document.getElementById('attribute-to-change');
element.innerHTML=内容;
}
返回{
callChangeHTML:function(){
changeHTML();
控制台日志(内容);
}
};
})();
HTMLChanger.callChangeHTML();//输出:“内容”
console.log(HTMLChanger.contents);//未定义
console.log(HTMLChanger.contents);//未定义
HTMLChanger变量被指定给IIFE(立即调用的函数表达式)的返回值。返回值如下所示:
return {
callChangeHTML: function() {
changeHTML();
console.log(contents);
}
};
因此,它被设置为包含一个名为callChangeHTML
的属性的对象。变量contents
和changeHTML
仅在IIFE的范围内定义,并且不是返回对象的属性(否则,它将破坏此模式的目的,即隐藏实现细节)。IIFE之外的代码绝对无法访问它们,除非向返回的对象添加更多函数,如getter和setter。看起来是这样的:
var HTMLChanger=(函数(){
var contents='contents'//这只是一个变量!不是属性!
var changeHTML=函数(){
var元素=document.getElementById('attribute-to-change');
element.innerHTML=内容;
}
返回{
callChangeHTML:function(){
changeHTML();
控制台日志(内容);
},
getContents:function(){
返回内容;
}
};
})();
HTMLChanger.callChangeHTML();//输出:“内容”
console.log(HTMLChanger.getContents());//还输出“内容”
console.log(HTMLChanger.contents);//未定义
HTMLChanger变量被指定给IIFE(立即调用的函数表达式)的返回值。返回值如下所示:
return {
callChangeHTML: function() {
changeHTML();
console.log(contents);
}
};
因此,它被设置为包含一个名为callChangeHTML
的属性的对象。变量contents
和changeHTML
仅在IIFE的范围内定义,并且不是返回对象的属性(否则,它将破坏此模式的目的,即隐藏实现细节)。IIFE之外的代码绝对无法访问它们,除非向返回的对象添加更多函数,如getter和setter。看起来是这样的:
var HTMLChanger=(函数(){
var contents='contents'//这只是一个变量!不是属性!
var changeHTML=函数(){
var元素=document.getElementById('attribute-to-change');
element.innerHTML=内容;
}
返回{
callChangeHTML:function(){
changeHTML();
控制台日志(内容);
},
getContents:function(){
返回内容;
}
};
})();
HTMLChanger.callChangeHTML();//输出:“内容”
console.log(HTMLChanger.getContents());//还输出“内容”
var contents
的作用域是您的HTMLChanger函数——它不是静态的。这两行没有区别,都会导致未定义的结果HTMLChanger
是{callChangeHTML:function(){…}
对象,它没有.contents
属性。@JeremyHarris问题edited@Bergi问题编辑我不明白这个问题。如果我们使用显示模块模式只显示我们想要的信息,那么只显示我们想要的信息有什么好处?var contents
的作用域是您的HTMLChanger函数——它不是静态的。这两行没有区别,并且都会导致未定义的HTMLChanger
是{callChangeHTML:function(){…}
对象,它没有.contents
属性。@JeremyHarris问题edited@Bergi问题编辑我不明白这个问题。如果我们使用显示模块模式只显示我们想要的信息,那么只显示我们想要的信息有什么好处?