对象的扩展
-
属性和值的简写:如果属性和值的名称相同,可以简写为
obj{foo}
-
函数也可以简写
hello(){}
let foo="你好";
let obj={
foo,// 相当于foo:foo
hello(){},// 相当于hello:function (){},
info(){},
};
console.log(obj);
- 对象中的
getter setter
访问器(使用时是get
和set
)
Es5Object.defineProperty
设置
let obj = {
_num: 0,
}
Object.defineProperty(obj, "_num", {
get: function () {
//返回值
console.log("我在返回值");
return this._num;
},
set: function (val) {
console.log("设置值");
try {
if (val) {
this._num = val;
}
else {
throw new Error("val is no value");
}
}
catch (err) {
console.log(err);
}
}
})
obj._num=2;//设置值
Es6中
//get set 访问器是给对象封装属性的
let obj = {
get names() {
console.log("返回值");
return this.name;
},
set names(val) {
console.log("设置值");
try {
if (val) {
this.name = val;
}
else {
throw new Error("val is no value");
}
}
catch (err) {
console.log(err);
}
}
}
obj.names="张三";
console.log(obj.names);
对象的扩展属性
1)解构赋值,对应有的就赋值,没有的合并为对象
2)引用空间:凡是修改引用的值都会修改原值
例一:
x是解构赋值所在的对象,拷贝了对象obj的a属性。a属性引用了一个对象,修改这个对象的值,会影响到解构赋值对它的引用。
let obj = {a: {b: 1}};
let {...x}=obj;
obj.a.b=2;
console.log(x);//2
例二:
let a=[{m:1},2,3];
let b= [...a];
b[0].m=2;
console.log(a);
3)对象扩展符:
let {a,...b}={a:23,x:1,y:2};
console.log(a,b);//23 {x: 1, y: 2}