在 JavaScript 中,我们可以通过给对象添加属性来存储数据和状态,这些属性可以被读取、修改、删除等。但有时候,我们希望一些属性不被外部访问、修改,这时候就需要使用一些技巧来设置属性的不可见性。ES9 引入了一些新特性,使得设置属性不可见性变得更加方便。
使用 Symbol 类型
Symbol 类型是 ES6 中引入的一种新类型,它的主要作用是用来创建唯一的标识符,可以用作对象的属性名。在 ES9 中,我们可以使用 Symbol 类型来创建一个不可见的属性。
示例代码:
const obj = { visible: 'visible', [Symbol('invisible')]: 'invisible' }; console.log(obj.visible); // 'visible' console.log(obj[Symbol('invisible')]); // undefined console.log(obj[Object.getOwnPropertySymbols(obj)[0]]); // 'invisible'
在上面的示例中,我们给 obj
添加了两个属性,一个是可见的属性 visible
,另一个是不可见的属性 invisible
。使用 Symbol('invisible')
创建的属性名是唯一的,不同的 Symbol
值创建的属性名也是不同的,因此在访问时需要使用相同的 Symbol
值。
使用 WeakMap 类型
WeakMap 类型也是 ES6 中引入的一种新类型,它是一种弱引用的映射表,可以用来存储对象和对象之间的关系。在 ES9 中,我们可以使用 WeakMap 类型来存储不可见的属性。
示例代码:
-- -------------------- ---- ------- ----- -- - --- ---------- ----- ------- - ------------- - ------------ - ---------- ----------- --- ------------ - ---------- - -------------- - ------ ----------------------- - - ----- --- - --- ---------- ------------------------- -- --------- -------------------------------- -- ----------- -------------------------------------- -- ---------
在上面的示例中,我们使用 WeakMap 类型来存储不可见的属性,将属性和对象之间的关系存储在了 WeakMap 中。在 MyClass
的构造函数中,我们使用 wm.set(this, { invisible: 'invisible' })
将不可见的属性 invisible
和 MyClass
对象关联起来,然后可以在 getInvisible
方法中通过 wm.get(this)
获取该属性的值。
总结
在 JavaScript 中,设置属性的不可见性可以使用 Symbol 类型或 WeakMap 类型来实现。使用 Symbol 类型创建的属性名是唯一的,使用 WeakMap 类型存储的属性是与对象关联的。这些新特性使得设置属性不可见性变得更加方便,可以更好地保护对象的数据和状态,提高代码的安全性和可维护性。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/655a546cd2f5e1655d4a66c7