let s = Symbol()
console.log(s, typeof s)
let s1 = Symbol('Leozi')
console.log(s1, typeof s1) // Symbol('Leozi') symbol
let s2 = Symbol('Leozi')
console.log(s1 === s2) // false
let s3 = Symbol.for('Leozi')
let s4 = Symbol.for('Leozi')
console.log(s3 === s4) // true
注意:Symbol类型不能和其它数据进行运算或比较,Symbol类型的Key不能通过Object.keys()、for…in、getOwnPropertyNames枚举,它没有被包含在对象自身的属性名集合中,故可以把不对外开放的属性用Symbol定义。
由于Symbol类型的唯一性,可以用它来对不知道内部结构的对象添加属性,这样可以保证对象内的属性名不重复。
let game = {
name : 'Leozi',
id : 123,
vip : true,
up : function () { console.log(1) },
down : function () { console.log(2) },
[Symbol('say')] : function () {
console.log(33)
}
}
let method = {
up: Symbol(),
down: Symbol()
}
game[method.up] = function () {
console.log(11)
}
game[method.down] = function () {
console.lof(22)
}
console.log(game)
a.js
const PASSWORD = Symbol()
class Login {
constructor(username,password){
this.username = username;
this[PASSWORD] = password
}
checkPassword(pwd){
return this[PASSWORD] === pwd
}
}
export default Login;
index.js
import Login from "/a.js";
const login = new Login("admin", "123456");
console.log(login.checkPassword("123456")) // true
console.log(login.PASSWORD) // undefined
console.log(login["PASSWORD"]) // undefined
由于Symbol常量PASSWORD被定义在a.js模块中,外面模块无法获取此Symbol(Symbol是唯一的),因此PASSWORD只能被限定在a.js中使用,使用它来定义类属性外部模块无法访问,达到了私有化的目的。