gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 23:56:31 25 4
gpt4 key购买 nike

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

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

},
privateMethod1 = function(){

};

return {init:initialize}
)();

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

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

最佳答案

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

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

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

{
_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() , 因此对象的符号不是真正私有(private)的,不适合保护数据免受恶意事件。

然而,在实践中,您执行的大多数操作(for of 循环等)不会触及符号。因此,它是下划线 _ 约定的绝佳替代品。但有时甚至有better ways ,例如 using a WeakMap .

由于词法作用域,使用 ES6 我们实际上可以避免 IIFE 的轻微开销。

const myModule = {};

{
const privateBar = 1;
myModule.publicFoo = 4;
}

关于javascript - 在封装上揭示模块与对象文字模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41476365/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com