将符号引入ES6的动机是什么?

将符号引入ES6的动机是什么?

您可能知道他们计划在ECMAScript 6中包含新的Symbol原语类型(更不用说其他一些疯狂的东西)。我一直认为:symbolRuby 中的概念是不必要的; 我们可以轻松地使用纯字符串,就像我们在JavaScript中一样。现在他们决定用JS复杂化JS。

我不明白动机。有人可以向我解释我们是否真的需要JavaScript中的符号吗?


心有法竹
浏览 391回答 3
3回答

肥皂起泡泡

将符号引入Javascript的最初动机是启用私有属性。不幸的是,他们最终被严重降级。它们不再是私有的,因为您可以通过反射找到它们,例如,使用Object.getOwnPropertySymbols或代理。它们现在被称为唯一符号,它们唯一的用途是避免属性之间的名称冲突。例如,ECMAScript本身现在可以通过某些方法引入扩展钩子,这些方法可以放在对象上(例如,定义它们的迭代协议),而不会有与用户名冲突的风险。这是否足够强大,为语言添加符号的动机是值得商榷的。

白板的微信

符号不保证真正的隐私,但可用于分隔对象的公共和内部属性。让我们举一个例子,我们可以用它Symbol来拥有私有财产。让我们举一个例子,其中对象的属性不是私有的。var Pet = (function() {   function Pet(type) {     this.type = type;   }   Pet.prototype.getType = function() {     return this.type;   }   return Pet;}());var a = new Pet('dog');console.log(a.getType());//Output: doga.type = null;//Modified outsideconsole.log(a.getType());//Output: null上面,Pet类属性type不是私有的。为了使它成为私有,我们必须创建一个闭包。下面的例子说明了我们如何type使用闭包来私有化。var Pet = (function() {   function Pet(type) {     this.getType = function(){       return type;     };   }   return Pet;}());var b = new Pet('dog');console.log(b.getType());//dogb.type = null;//Stays privateconsole.log(b.getType());//dog上述方法的缺点:我们为每个Pet创建的实例引入了一个额外的闭包,这可能会损害性能。现在我们介绍Symbol。这可以帮助我们将属性设为私有,而无需使用额外的不必要的闭包。代码示例如下:var Pet = (function() {   var typeSymbol = Symbol('type');   function Pet(type) {     this[typeSymbol] = type;   }   Pet.prototype.getType = function(){     return this[typeSymbol];   }   return Pet;}());var a = new Pet('dog');console.log(a.getType());//Output: doga.type = null;//Stays privateconsole.log(a.getType());//Output: dog
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

JavaScript