Appearance
Symbol
Symbol ES6 添加的一个新的基本类型
Symbol 类型的值是通过 Symbol 函数生成的,
js
var symbol = Symbol();
相同类型的 Symbol 函数返回的值是唯一的。
so:
js
var symbol1 = Symbol();
console.log(symbol === symbol1); // false
Symbol 函数可以接受字符串作为参数,但是即使相同的字符串其返回值也是唯一的
so:
js
var symbol2 = Symbol('symbol');
var symbol3 = Symbol('symbol'));
console.log(symbo3 === symbol2) // false
作用
1. 保护对象的私有变量
js
var P = (function() {
var _gender;
var P = function(name, gender) {
this.name = name;
_gender = gender;
};
P.prototype.getGender = function() {
return _gender;
};
return P;
})();
var p = new P('name', 'gender');
console.log(p);
console.log(p.getGender());
// 问题就是 我们在p实例对象上找不到这个私有属性。
那么我们修改一下,使用随机数的方式
js
var P = (function() {
var P = function(name, gender) {
this.name = name;
this[Math.random()] = gender;
};
return P;
})();
var p = new P('name', 'gender');
console.log(p);
这时候我们虽然是 不知道这个属性的 p[random]
的值 但是我们打印出来后还是可以使用 p['0.9257493410066007'] = 'gender'
所以其事实上还不是私有的,还是可以通过属性访问
js
// 第三种方式
var P = (function() {
var _gender = Symbol('gender');
var P = function(name, gender) {
this.name = name;
this[_gender] = gender;
};
return P;
})();
var p = new P('name', 'gender');
console.log(p); // {name: "name", Symbol(gender): "gender"}
这时候我们通过 p[Symbol('gender')] === undefined
我们通过 p['Symbol(gender)'] === undefined
所以其才是真正的私有属性。
处理魔鬼字符串
如 const STATUS1 = 1;
这时候就可以这样定义
js
let STATUS1 = Symbol(1);