ES6中Symbol类型用法实例详解
本文实例讲述了ES6中的Symbol类型。分享给大家供大家参考,具体如下:
Symbol是在ES6中新加入的类型。
正如我们所知,JavaScript中有以下几种类型:
Undefined,Null,Boolean,Number,String,Object。
但是上述类型在处理某些情况的时候是远远不够的。下面我们来举一个例子:
假设我们要移动div,也需要在某些情况下判断该div是否处于移动状态,所以我们会想到给div这类的对象设置一个属性。
if(element.isMoving){ smoothAnimations(element); } element.isMoving=true;
但是这样会存在一些问题,比如:
我们可能和第三方的库冲突;
我们可能和未来的标准冲突等。
于是可以采用第二种方法,也就是采用加密函数,制定一个值:
varisMoving=SecureRandom.generateName(); ... if(element[isMoving]){ smoothAnimations(element); } element[isMoving]=true;
这样确实解决了冲突问题,但却带来了调试问题,我们每次查看该对象属性时都会看见一大堆垃圾命名。
于是为了解决冲突问题,ES6提出了Symbol这样的新类型。
Symbol是一种特殊的、不可变的数据类型,可以作为对象属性的标识符使用。我们看demo:
varsym1=Symbol(); varsym2=Symbol("foo"); varsym3=Symbol("foo");
Symbol("foo")不会强制字符串"foo"进入一个Symbol,它每次都创建一个新的Symbol:
Symbol("foo")===Symbol("foo");//false
所以可以利用这个特性来创建私有属性:
(function(){ //创建symbol varkey=Symbol("key"); functionMyClass(privateData){ this[key]=privateData; } MyClass.prototype={ doStuff:function(){ ...this[key]... } }; })(); varc=newMyClass("hello") c["key"]===undefined//无法访问该属性,因为是私有的
也可以利用Symbol来解除上面所说的冲突问题:
//createauniquesymbol varisMoving=Symbol("isMoving"); ... if(element[isMoving]){ smoothAnimations(element); } element[isMoving]=true;
当然,也可以通过另外的调用方法来生成可以与外界共享的Symbol类型,就是Symbol.for方法。
Symbol.for(key)方法会根据给定的键key,来从symbol注册表中找到对应的symbol,如果找到了,则返回它,否则,新建一个与该键关联的symbol,并放入symbol注册表中。
Symbol.for("foo");//创建一个symbol并放入symbol注册表中,键为"foo" Symbol.for("foo");//从symbol注册表中读取键为"foo"的symbol Symbol.for("bar")===Symbol.for("bar");//true,证明了上面说的 Symbol("bar")===Symbol("bar");//false,Symbol()函数每次都会返回新的一个symbol varsym=Symbol.for("mario"); sym.toString(); //"Symbol(mario)",mario既是该symbol在symbol注册表中的键名,又是该symbol自身的描述字符串
所以为了防止冲突,我们最好给symbol带上前缀:
Symbol.for("mdn.foo"); Symbol.for("mdn.bar");
希望本文所述对大家ECMAScript程序设计有所帮助。