Skip to content

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);