将符号引入ES6的动机是什么?您可能知道他们计划在ECMAScript 6中包含新的Symbol原语类型(更不用说其他一些疯狂的东西)。我一直认为:symbolRuby 中的概念是不必要的; 我们可以轻松地使用纯字符串,就像我们在JavaScript中一样。现在他们决定用JS复杂化JS。我不明白动机。有人可以向我解释我们是否真的需要JavaScript中的符号吗?
3 回答

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

白板的微信
TA贡献1883条经验 获得超3个赞
符号不保证真正的隐私,但可用于分隔对象的公共和内部属性。让我们举一个例子,我们可以用它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
添加回答
举报
0/150
提交
取消