Symbol
ES6新增的数据类型 - 基本类型
值是由 Symbol 函数调用产生的
var s1 = Symbol();
var s2 = Symbol();
console.log( typeof s1 ); // symbol
console.log(s1, s2); // Symbol() Symbol()
var s3 = Symbol('miaov');
var s4 = Symbol('miaov');
console.log(s3, s4); // Symbol(miaov) Symbol(miaov)
console.log( s3 == s4 ); // false
由上面的代码可以看出symbol产生的是一个唯一值,即使传入的参数一致,产生的值也是不同的。
用处
- 属性私有化 - 数据保护
例如:我希望一个Person的性别在出生以后就能够被确定,并一直保存到死
- 不使用symbol
var Person = (function() {
var _gender = '';
function P(name, gender) {
this.name = name;
_gender = gender;
}
P.prototype.getGender = function() {
return _gender;
}
return P;
})();
var p1 = new Person('莫涛', '男');
console.log(p1); // P {name: "莫涛"}
console.log(p1.getGender()); // 男
私有化属性的方法就是不将属性直接定义在this对象上,而是放到整个函数的局部变量中
- symbol
var Person = (function() {
let _gender = Symbol('gender');
function P(name, gender) {
this.name = name;
this[_gender] = gender;
}
P.prototype.say = function() {
console.log(this[_gender]);
}
return P;
})();
var p1 = new Person('莫涛', '男');
console.log(p1); //P {name: "莫涛", Symbol(gender): "男"}
console.log(p1[Symbol('gender')]) //undefined
通过symbol产生的值唯一,只在内部有局部变量存储,达到只读(反正我不知道这个东西与上面的实现有什么区别,可能是我太笨了,哈哈哈)