ES6-Symbol类型添加的对象方法调用以及注意事项

symbol 是一种基本数据类型. 每个从Symbol()返回的symbol值都是唯一的。一个symbol值能作为对象属性的标识符;这是该数据类型仅有的目的。

 //向对象中添加方法 up down
  let game = {
    name:'俄罗斯方块',
    up: function(){},
    down: function(){}
  };
  // 声明一个对象
  let methods = {
    up: Symbol(),
    down: Symbol()
  };
  game[methods.up] = function(){
    console.log("我可以改变形状");
  }
  game[methods.down] = function(){
    console.log("我可以快速下降!!");
  }
game[methods.up]();
game[methods.down]();
let youxi = {
    name:"狼人杀",
    [Symbol.for('say')]: function(){
      console.log("我可以发言")
    },
    [Symbol.for('zibao')]: function(){
      console.log('我可以自爆');
    }
  }
  console.log(youxi);
  //Symbol.for('say')产生的标识是唯一的,所以可以调用定义在youxi里面的[Symbol.for('say')]方法
  youxi[Symbol.for('say')]();
  youxi[Symbol.for('zibao')]();

let youxi1 = {
    name:"狼人杀",
    [Symbol('say')]: function(){
      console.log("我可以发言")
    },
    [Symbol('zibao')]: function(){
      console.log('我可以自爆');
    }
  }
  youxi[Reflect.ownKeys(youxi)[1]]();
  youxi[Reflect.ownKeys(youxi)[2]]();
  //静态方法 Reflect.ownKeys() 返回一个由目标对象自身的属性键组成的数组。
  //这种情况无法直接调用,因为每次 Symbol("xxx") 都是不一样的
  //因为Symbol('say')生成的标识不是唯一的,所以定义的在youxi1里面的[Symbol('say')]是无法调用的,除非把Symbol('say')放块外面定义,并用变量保存
  console.log(Symbol('say')===Symbol('say')); //false
  // youxi1[Symbol('say')](); //报错
  // youxi1[Symbol('zibao')](); //报错

    let S1=Symbol('CSDN')
    let S2=Symbol('CSDN')
    let S3=Symbol.for('CSDN')
    let S4=Symbol.for('CSDN')
    console.log(S1===S2)//false
    console.log(S3===S4)//true
  //因为Symbol('***')生成的标识不是唯一的,所以定义的S1不等于S2
  // Symbol.for()与Symbol()这两种写法,都会生成新的 Symbol。
  // 它们的区别是,前者会被登记在全局环境中供搜索,后者不会。
    
  //Symbol.for()不会每次调用就返回一个新的 Symbol 类型的值,而是会先检查给定的key是否已经存在,如        
  果不存在才会新建一个值。比如,如果你调用Symbol.for("cat")30 次,每次都会返回同一个 Symbol 值, 
  但是调用Symbol("cat")30 次,会返回 30 个不同的 Symbol 值。
  //里面的***这个标志就像 你给代码写的注释一样

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值