ES6中Symbol类型用法实例详解
本文实例讲述了es6中的symbol类型。分享给大家供大家参考,具体如下:
symbol是在es6中新加入的类型。
正如我们所知,javascript中有以下几种类型:
undefined ,null ,boolean ,number ,string, object。
但是上述类型在处理某些情况的时候是远远不够的。下面我们来举一个例子:
假设我们要移动div,也需要在某些情况下判断该div是否处于移动状态,所以我们会想到给div这类的对象设置一个属性。
if (element.ismoving) { smoothanimations(element); } element.ismoving = true;
但是这样会存在一些问题,比如:
我们可能和第三方的库冲突;
我们可能和未来的标准冲突等。
于是可以采用第二种方法,也就是采用加密函数,制定一个值:
var ismoving = securerandom.generatename(); ... if (element[ismoving]) { smoothanimations(element); } element[ismoving] = true;
这样确实解决了冲突问题,但却带来了调试问题,我们每次查看该对象属性时都会看见一大堆垃圾命名。
于是为了解决冲突问题,es6提出了symbol这样的新类型。
symbol是一种特殊的、不可变的数据类型,可以作为对象属性的标识符使用。我们看demo:
var sym1 = symbol(); var sym2 = symbol("foo"); var sym3 = symbol("foo");
symbol("foo")
不会强制字符串 "foo" 进入一个symbol,它每次都创建一个新的symbol:
symbol("foo") === symbol("foo"); // false
所以可以利用这个特性来创建私有属性:
(function() { // 创建symbol var key = symbol("key"); function myclass(privatedata) { this[key] = privatedata; } myclass.prototype = { dostuff: function() { ... this[key] ... } }; })(); var c = new myclass("hello") c["key"] === undefined//无法访问该属性,因为是私有的
也可以利用symbol来解除上面所说的冲突问题:
// create a unique symbol var ismoving = 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 var sym = symbol.for("mario"); sym.tostring(); // "symbol(mario)",mario 既是该 symbol 在 symbol 注册表中的键名,又是该 symbol 自身的描述字符串
所以为了防止冲突,我们最好给symbol带上前缀:
symbol.for("mdn.foo"); symbol.for("mdn.bar");
希望本文所述对大家ecmascript程序设计有所帮助。
上一篇: ES6中module模块化开发实例浅析
下一篇: 影音先锋常规设置及功能介绍