在 JavaScript 中,对象属性通常是公开的,这意味着它们可以随时被修改和访问。然而,在某些情况下,我们可能希望某些属性是私有的,并且无法被直接访问和修改。ES6 引入了 Symbol 类型,可以用来创建私有属性和方法,来解决这样的问题。
什么是 Symbol
Symbol 是 ES6 中引入的一种新的基础数据类型。每个 Symbol 都是唯一的,并且可以用于创建对象的私有属性和方法。
Symbol 的语法非常简单,只需要使用 Symbol()
语法即可创建一个 Symbol:
const mySymbol = Symbol();
如果你多次调用 Symbol()
,每次都会创建一个新的、不同的 Symbol:
const mySymbol1 = Symbol(); const mySymbol2 = Symbol(); console.log(mySymbol1 === mySymbol2); // false
使用 Symbol 创建私有属性和方法
我们可以使用 Symbol 来创建私有属性和方法,以防止它们被意外或恶意地修改或访问。
下面是一个使用 Symbol 创建私有属性和方法的示例:
// javascriptcn.com 代码示例 const ageSymbol = Symbol('age'); const myObject = { name: 'Tom', [ageSymbol]: 25, getAge() { return this[ageSymbol]; } }; console.log(myObject.name); // Tom console.log(myObject.getAge()); // 25 console.log(myObject.age); // undefined
在这个示例中,我们使用 Symbol 创建了一个名为 age
的私有属性,并在对象字面量中使用了该 Symbol 属性。由于这是一个私有属性,因此它无法通过 myObject.age
访问到。
稍后,我们还定义了一个名为 getAge
的方法,该方法可以访问该私有属性并返回它的值。由于它是在对象字面量中定义的,因此它可以像其他方法一样被调用。
请注意,我们在创建 Symbol 时还可以为其指定一个描述(注意是在应用中看的到的,而不是外部看到的)。这个描述不会改变 Symbol 的唯一性,但可以在调试时提供有用的上下文信息。
Symbol 的作用
除了创建私有属性和方法之外,Symbol 还有其它许多有用的应用。
1. 防止属性名冲突
Symbol 可以用于创建全局唯一的属性名,以防止属性名冲突。
const mySymbol = Symbol('myUniqueSymbol'); const myObject = { [mySymbol]: 'value' }; console.log(myObject[mySymbol]); // "value"
2. 定义内置对象属性
部分内置对象,例如 Math 和 Array,可以使用 Symbol 定义额外的属性和方法。
const myMethodSymbol = Symbol('myMethod'); Array.prototype[myMethodSymbol] = function() { console.log('My method.'); }; const myArray = [1, 2, 3]; myArray[myMethodSymbol](); // "My method."
3. 迭代对象
使用 Symbol.iterator,我们可以定义一个返回可迭代对象的迭代器。这个功能在 for...of 循环和使用扩展运算符时非常有用。
// javascriptcn.com 代码示例 const myIterable = { data: [1, 2, 3], [Symbol.iterator]() { let index = 0; return { next: () => { if (index < this.data.length) { return {value: this.data[index++], done: false}; } else { return {done: true}; } } }; } }; for (const value of myIterable) { console.log(value); // 1 2 3 }
总结
Symbol 类型是 ES6 中引入的一种新的基础数据类型,它可以用于创建私有属性和方法,以及防止属性名冲突、定义内置对象属性和迭代对象等。在编写 JavaScript 应用程序时,使用 Symbol 可以使代码更安全、更可靠,特别是在需要创建私有属性和方法时。
来源:JavaScript中文网 ,转载请注明来源 本文地址:https://www.javascriptcn.com/post/65864940d2f5e1655d0a7d69