1.属性简洁表示
let obj = {like:11};
let obj2 = {obj};// //相当于以下的写法 let obj2 = {obj:obj}
console.log(obj2);// { obj: { like: 11 } }
个人理解,和解构的过程是相反的,解构:
let {obj} = obj2;// let obj = obj2.obj
2.方法简写
let obj = {
method(x){
console.log(x)
},
}
与以下的写法是相等的
let obj = {
method:function(x){
console.log(x)
}
}
简写用于模块导出:
//导出模块
//简写用于函数的返回值
function func1(){}
function func2(){}
function func3(){}
function func4(){}
module.exports = {
func1,
func2,
func3,
func4,
}
导入:
let obj = require('./testJS.js');// 对应 module.exports
console.log(obj);
/**
*{ func1: [Function: func1],
* func2: [Function: func2],
* func3: [Function: func3],
* func4: [Function: func4] }
*/
属性的赋值器(setter)和取值器(getter),事实上也是采用这种写法。
let obj = {
_like:4,
get like(){
return this._like;
},
set like(value){
console.log(value)
this._like = value;
},
}
obj.like = 'dsfdsf';
简写的对象方法不能用作构造函数,会报错
//一个未简写的函数 可以做构造函数
let obj = {
like:function (){
console.log('obj - like')
},
}
new obj.like();// obj - like
// 一个简写的函数
let obj2 = {
like(){
console.log('obj2 - like')
},
}
new obj2.like();// 报错 TypeError: obj2.like is not a constructor
//同样的,箭头函数也不能作为构造函数
let obj3 = {
like:()=>{
console.log('arrow-like')
}
}
new obj3.like();// 报错 TypeError: obj2.like is not a constructor
3.属性名表达式
// 方法一 (标识符)
obj.foo = true;
// 方法二 (属性名表达式)
obj['a' + 'bc'] = 123;
用于定义对象:
let name = 'diyName'+Math.floor(Math.random()*10)
let obj = {
[name]:'不确定的函数名',
oth:'我是确定的'
}
console.log(obj)
运行效果:
用于定义方法名称:
let name = 'diyName'+Math.floor(Math.random()*10)
let obj2 = {
[name]:function(){
console.log("我现在的名字是"+name)
},
}
运行效果:
注意,属性名表达式如果是一个对象,默认情况下会自动将对象转为字符串[object Object]
let obj = {hehe:'11'}
let obj2 = {
[obj]:'我还不知道我的属性名称'
}
console.log(obj2);//{ '[object Object]': '我还不知道我的属性名称' }
属性名表达式与简洁表示法,不能同时使用,会报错:
SyntaxError: Unexpected token }
输入的时候编辑器都已经提示有错误