ES6+ 对象的扩展
1. 前言
JavaScript 中对象是非常重要的数据结构,ES6 对对象进行了极大的扩展,使用上也更加简洁。前面我们学习了 扩展语法 和 剩余参数 是对象扩展的其中的一部分,本节和后面几节会对 Object 的扩展进行系统的介绍。后面我们还会学到新的数据结构 Set 和 Map 也是对对象的扩展,另外,还有 Proxy 和 Reflect 也是对象的重大升级。本节主要学习以下几点
2. 简洁的属性表达
2.1 属性值简写
var name = 'imooc';
// ES5
var obj1 = {
name: name,
}
// ES6
var obj2 = {
name,
}
// ES5
function getobj(x, y) {
return {x: x, y: y};
}
// 等同于 ES6
function getobj(x, y) {
return {x, y};
}
getobj(, ) // {x: 1, y: 2}
上面中的代码可以看出,在我们平常开发中,组装数据时是非常方便、有用的。
2.2 对象中方法的简写
const name = '张三'
// ES5
var person = {
name: name,
getName: function() {
console.log('imooc')
}
};
// ES6
var person = {
name,
getName() {
console.log(this.name)
}
};
console.log(person) // {name: "imooc", getName: ƒ}
在 Node 中进行模块导出时,这种方式更加方便。我们看下面的例子:
var person = {};
function getName () {
return person.name
}
function setName () {
person.name = '李四'
}
function clear () {
person = {};
}
// ES5 写法
module.exports = {
getName: getName
setName: setName,
clear: clear
};
// ES6写法
module.exports = { getName, setName, clear };
3. 简洁的属性表达
var obj = {
name: 'imooc',
age:
}
var key = 'name';
var obj = {
[key]: 'imooc',
['a' + 'ge']:
}
var str = 'first name';
var obj = {
['I love imooc']: 'ES6 Wiki',
[str]: 'Jack'
}
console.log(obj['I love imooc']) // ES6 Wiki
console.log(obj[str]) // Jack
console.log(obj['first name']) // Jack
表达式还可以用于定义对象上的方法名。
var person = {
name: 'Jack',
['get' + 'Name']() {
console.log(this.name)
}
};
console.log(person.getName()) // Jack
// 报错
var name = 'Jack';
var age = ;
var person = { [name] };
// Uncaught SyntaxError: Unexpected token '}'
var name = 'Jack';
var person = { [name]: }; // {Jack: 18}
var key1 = {name: 'imooc'};
var key2 = {age: };
var obj = {
[key1]: 'value content 1',
[key2]: 'value content 2',
}
console.log(obj) // {[object Object]: "value content 2"}
var keys = ['imooc', '7'];
var obj = {
[keys]: 'value content',
}
console.log(key.toString()) // "imooc,7"
console.log(obj) // {imooc,7: "value content"}
console.log(obj[keys]) // "value content"
var person = {
name: "Jack",
getName() {
console.log(this.name);
},
};
person.getName.name // "getName"
(new Function()).name // "anonymous"
var doSomething = function() {
// todo
};
doSomething.bind().name // "bound doSomething"
const key1 = Symbol('description content');
const key2 = Symbol();
let obj = {
[key1]() {},
[key2]() {},
};
obj[key1].name // "[description content]"
obj[key2].name // ""