【问题标题】:revealing module vs object literal pattern on encapsulation在封装中揭示模块与对象字面量模式
【发布时间】:2017-05-19 11:37:49
【问题描述】:

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

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

   },
   privateMethod1 = function(){

   };

   return {init:initialize}
)();

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

javascript 是函数作用域,文字模式如何封装作用域?

【问题讨论】:

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


    【解决方案1】:

    所有需要真正私有数据的模块模式必须固有地使用IIFE 来维护它们自己的私有范围。甚至对象文字模块模式也使用它。看一些module patterns的对比,

    您可以使用对象字面量以多种方式存储伪私有数据:

    按照惯例,以_ 下划线开头的属性被理解为禁止访问世界其他地方。

    {
        _privateBar : 1
        publicFoo : 4,
    }
    

    或者,您可以使用symbols

    const privateBar = Symbol('private');
    myModule[privateBar] = 1;
    myModule.publicFoo = 4;
    

    使用后者,只有对privateBar 符号对象的引用才能从myModule 中获取1 的值。不,你不能用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;
    }
    

    【讨论】:

    • 我在问如何使用对象文字模式进行封装,因为它们只是一堆对象。
    • @NatelyJamerson 我添加了更多信息,包括所谓的“对象文字模块模式”仍然包含用于封装的 IIFE。如果这不适合您,也许您可​​以添加一些链接到您阅读的内容以及您认为作者的意思或他们的代码在做什么。然后我可以用更多的上下文来解释或更正它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    相关资源
    最近更新 更多