我通常为每个功能做组件,说我有abc功能,我将在js下面创建
var AbcComponent = (function(){}
var initialize = function(){
},
privateMethod1 = function(){
};
return {init:initialize}
)();
并在app.js中加入AbcComponent.init();
。几天前我使用对象文字模式准备了OO,我怀疑自己的写作风格。
由于javascript是函数范围,文字模式如何封装范围?
答案 0 :(得分:1)
所有需要拥有真正私有数据的模块模式必须使用IIFE来维护自己的私有范围。甚至对象文字模块模式也使用它。查看一些module patterns,
的比较您可以使用对象文字以几种方式存储伪私有数据:
按照惯例,以_
下划线开头的属性被理解为对世界其他地方的禁区。
{
_privateBar : 1
publicFoo : 4,
}
或者,您可以使用symbols。
const privateBar = Symbol('private');
myModule[privateBar] = 1;
myModule.publicFoo = 4;
使用后者,只有对privateBar
符号对象的引用才能从1
获得myModule
的值。不,您无法通过myModule[Symbol('private')]
获取,因为符号是唯一的,Symbol('private') === Symbol('private')
是false
。
不幸的是,他们决定添加Object.getOwnPropertySymbols(),因此对象的符号不是真正的私有符号,不适合保护数据免受恶意活动的侵害。
但是,实际上,您执行的大多数操作(for of
循环等)都不会触及符号。因此,它是下划线_
惯例的绝佳替代品。但有时甚至有better ways,例如using a WeakMap。
使用ES6,我们可以通过词汇范围确实避免IIFE的轻微开销。
const myModule = {};
{
const privateBar = 1;
myModule.publicFoo = 4;
}