一、es6对象拓展
(1)对象中变量和函数的简写
es6中,对象和函数可以直接写在大括号中,简便省事。
let a = 123,
b = {
a,
c(){
console.log(this.a)
}
}
用于返回值,导出模块都很方便
function foo (x, y){
return {x, y}
}
let a = 123,
b = 'b';
module.exports = {foo, a, b}
属性复制器也是一种简写(getter、setter)
(2)属性名表达式
js中,属性名有两种书写方式:
a.标志符
let a = {name : 'a'}
b.表达式,可以拼接
let a = 'a',
b = {a},
c = { [ a + b.a ] : 'c'};
console.log(b, c) // => { a : 'a' } , { 'aa' : 'c' }
如果表达式里为非字符串,系统会将其转化为字符串
let obj = {};
obj[{}] = 1;
obj[null] = 'null';
console.log(obj) // => { '[object Object]' : 1, 'null' : 'null' }
注意点: 属性名简写和属性名表达式不能同时使用
let a = 'a',
b = {[a]}; // 报错
(3)获取对象自身属性描述信息 Object.getOwnPropertyDescriptor
是Object的静态方法。有两个参数,
1、目标对象
2、属性字符串
返回一个对象,有四个属性
a.value 属性的值
b.writable 是否可以修改
c.enumerable 是否可以被遍历
d.configurable 是否可以修改或者删除
上面四个属性都为数据描述符,
d. getter
e. setter
上面两个属性为存储描述符,getter和setter函数通过Object.getOwnPropertyDescriptor获取。字面量设置getter和setter,获取得属性描述信息中,confiurable和enumerable为true,没有writable属性,getter.name 为 (get + 函数名)
(4)Object.defineProperty,用来定义或修改现有属性
Object.definedProperty( obj, prop, descriptor )
注意点: value 或 writable 和 getter 或 setter不能同时存在,否则会报错
Object.defineProperty设置的属性数据描述符默认为false,字面量添加属性方式,数据描述符为true
let object= {},
theDescriptor =
{
configurable: true,
enumerable: true,
writable: true,
value: 123,
get(){
return this.value
},
set(val){
if(val < 10 ){
console.log( 'val太小了' )
}else{
this.value = val
}
}
};
Object.defineProperty(object, 'prop', theDescriptor)
修改与删除的情况。
a. writable, 控制是否可以修改。 为false时,修改相关对象属性,非严格模式会静默失败,严格模式下会报错。
b. configurable, 控制是否可以删除 为false时,属性不可删除。
(5)属性赋值器(getter、setter)
对象查找属性时,执行了一个隐式方法[[get]],赋值时执行了[[put]]操作;
[[get]]操作:
(1)先找getter,如果没有对应getter
(2)再沿着原型链找
[[put]]操作:
(1)先找setter,有就执行
(2)判断writable,如果为false,则停止修改
(3)如果writable为true,赋值
let obj = {
realName: 'selfName',
get name(){
return this.realName
},
set name(val){
this.realName = 'set' + val
}
}
console.log(obj.name)
obj.name = 'frank'
console.log(obj)