Es6对象的扩展

属性的简洁表达式

 ES6 允许直接写入变量和函数,作为对象的属性和方法。这样的书写更加简洁

实例以下

const baz = {foo};
baz // {foo: "bar"}

// 等同于
const baz = {foo: foo};

属性简写
方法也可以简写

  method() {
    return "Hello!";
  }
};

// 等同于

const o = {
  method: function() {
    return "Hello!";
  }
};
注意,简洁写法的属性名总是字符串,这会导致一些看上去比较奇怪的结果。

属性名表达式

java script 定义对象的属相,有两种方法

// 方法一
obj.foo = true;
// 方法二
obj['a' + 'bc'] = 123;
上面代码的方法一是直接用标识符作为属性名,方法二是用表达式作为属性名,这时要将表达式放在方括号之内。

但是,如果使用字面量方式定义对象(使用大括号),在 ES5 中只能使用方法一(标识符)定义属性

var obj = {
  foo: true,
  abc: 123
};

在Es6中既可以obj['a'+'bc']=123的表达式去写


let obj = {
  [propKey]: true,
  ['a' + 'bc']: 123
};

表达式可以用于定义方法名 需要注意的是简介表达式与属性名表达式不可以用同时使用 不然会报错。

const foo = 'bar';
const bar = 'abc';
const baz = { [foo] };

// 正确
const foo = 'bar';
const baz = { [foo]: 'abc'};

注意,属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object],这一点要特别小心

const keyA = {a: 1};
const keyB = {b: 2};

const myObject = {
  [keyA]: 'valueA',
  [keyB]: 'valueB'
};

myObject // Object {[object Object]: "valueB"}

上面代码中,[keyA]和[keyB]得到的都是[object Object],所以[keyB]会把[keyA]覆盖掉,而myObject最后只有一个[object Object]属性。

方法的 name 的属相

函数的name属性,返回函数名。对象方法也是函数,因此也有name属性。

const person = {
  sayName() {
    console.log('hello!');
  },
};

person.sayName.name   // "sayName"

你可能感兴趣的:(Es6对象的扩展)