为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

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

3 回答

?
肥皂起泡泡

TA贡献1829条经验 获得超6个赞

将符号引入Javascript的最初动机是启用私有属性。

不幸的是,他们最终被严重降级。它们不再是私有的,因为您可以通过反射找到它们,例如,使用Object.getOwnPropertySymbols或代理。

它们现在被称为唯一符号,它们唯一的用途是避免属性之间的名称冲突。例如,ECMAScript本身现在可以通过某些方法引入扩展钩子,这些方法可以放在对象上(例如,定义它们的迭代协议),而不会有与用户名冲突的风险。

这是否足够强大,为语言添加符号的动机是值得商榷的。


查看完整回答
反对 回复 2019-08-09
?
白板的微信

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


查看完整回答
反对 回复 2019-08-09
  • 3 回答
  • 0 关注
  • 390 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号