在封装上揭示模块与对象文字模式

时间:2017-01-05 02:18:06

标签: javascript jquery node.js oop design-patterns

我通常为每个功能做组件,说我有abc功能,我将在js下面创建

var AbcComponent = (function(){}
   var initialize = function(){

   },
   privateMethod1 = function(){

   };

   return {init:initialize}
)();

并在app.js中加入AbcComponent.init();。几天前我使用对象文字模式准备了OO,我怀疑自己的写作风格。

由于javascript是函数范围,文字模式如何封装范围?

1 个答案:

答案 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;
}