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。
  // 它们的区别是,前者会被登记在全局环境*搜索,后者不会。
 //里面的***这个标志就像 你给代码写的注释一样

 

 

上一篇:ES6-字符串扩展


下一篇:1945-祖安 say hello-String