在 JavaScript 中,对象的属性不仅可以是字符串,还可以是 symbol 类型。而访问对象的 symbol 属性则需要使用 Reflect.ownKeys 方法,这个方法从 ES6 时期开始就被引入了。
不过在一些旧版本的浏览器中,可能并没有实现 Reflect.ownKeys 方法,这就需要我们自己来实现它,或者使用第三方的包来简化这个过程。本文将介绍一个 npm 包——get-own-property-symbols-x,它可以方便地获取一个对象的 symbol 属性,并在使用时避免了兼容性的问题。
安装
使用 npm 安装 get-own-property-symbols-x:
npm install get-own-property-symbols-x
在你的项目中引入 get-own-property-symbols-x:
const getOwnPropertySymbols = require('get-own-property-symbols-x')
如果你使用了 ES6 的模块化机制,也可以使用 import
引入:
import getOwnPropertySymbols from 'get-own-property-symbols-x'
使用
使用 getOwnPropertySymbols(obj)
可以获取一个对象自身的 symbol 类型属性,返回的是一个 symbol 类型的数组:
const person = { name: 'John Snow', [Symbol('age')]: 28, [Symbol('gender')]: 'male' } const symbols = getOwnPropertySymbols(person) console.log(symbols) // [Symbol(age), Symbol(gender)]
除了获取对象的 symbol 属性之外,getOwnPropertySymbols 还有一个额外的参数 receiver,它可以用于指定 symbol 属性的获取者。假如一个对象自身并没有 symbol 属性,但是它的原型链上有这个属性,那么通过设置 receiver,即可获取到这个 symbol 属性。
const car = Object.create({ [Symbol('type')]: 'Sedan' }) const symbols = getOwnPropertySymbols(car, Object.getPrototypeOf(car)) console.log(symbols) // [Symbol(type)]
深入理解
在上面的代码示例中,我们已经用到了 getOwnPropertySymbols 的基本用法,但是在实际使用过程中还需要注意一些细节。
Symbol 的可枚举性
在 ES6 中,symbol 属性默认是不可枚举的。因此,即使你使用 Object.getOwnPropertySymbols 方法获取一个对象的 symbol 属性,也只能获取到自身的 symbol 属性,不能获取继承而来的 symbol 属性。
const car = Object.create({ [Symbol('type')]: 'Sedan' }) const allSymbols = Object.getOwnPropertySymbols(car) console.log(allSymbols) // []
如果想要获取继承来的 symbol 属性,只能使用上一节提到的 receiver 参数。
const allSymbols = getOwnPropertySymbols(car, Object.getPrototypeOf(car)) console.log(allSymbols) // [Symbol(type)]
Symbol 属性的保护性
在使用对象的 symbol 属性时,需要注意到 symbol 是一种私有的、不可变的数据类型。因此,我们应该使用唯一、描述性强的 symbol 属性,以便在代码维护时更加清晰。
同样的,我们也应该防止不小心修改 symbol 属性,造成原有逻辑的破坏。可以使用 Object.freeze
方法来保护 symbol 属性。
-- -------------------- ---- ------- ----- ------ - - ----- ----- ------ ---------------- --- ------------------- ------ - ------------------------------------ -- -- --- ----- ---------------------------------- -- -- --------------------- - -- -- ---------- --- ---- ---------------------------------- -- --
结语
get-own-property-symbols-x 这个 npm 包的出现为我们提供了一个方便、简单的方式来获取一个对象的 symbol 属性。希望今后在实际项目中能够合理地运用这个工具,在减少代码兼容问题、提高代码可读性方面发挥更大的作用。
来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/78450