为一个对象添加一个属性有三种方式
一是 通过点运算符
let obj = {};
obj.someKey= 'hello world';
二是 通过[] 中括号
let obj = {};
obj['someKey'] = 'hello world';
三是 Object对象defineProperty方法设置
对象里目前属性描述有2种形式 数据描述和存取描述。
数据描述 是对象属性的基本的描述,包括 删除、遍历(枚举)、重新赋值、值
// 数据描述
let obj = {};
undefined
Object.defineProperty(obj, 'a',
{
configurable:true, // 值true 该属性可被删除或是是重新配置, 默认值是false
enumerable:true, // true可遍历, 默认值是false
writable:true, // true可重新赋值, 默认值是false
value:'a'
})
存取描述主要对过程描述的,由get 、 set 实现的
// 存取描述
let obj = {};
Object.defineProperty(obj, 'a', {
get(){
console.log(111);
},
set(val){
console.log(val);
}
})
运行结果


存取描述,是对象属性值在读取或是设置的时候执行
注意,存取描述符和数据描述符中, configurable、enumerable、 value、 writable默认值及设置时不同的
存取描述很有意思的,在双向数据绑定中使用。
//////存档实现,把同一个对象同一个属性每次设置的值进行存储
function Archiver (val) {
let archive = [];
let middle = null;
Object.defineProperty(this, 'val',{
get(middle){
console.log('get');
return middle
},
set(value){
middle = value;
archive.push({val: middle});
}
})
// 利用闭包把每次设置的值存放在变量中
this.getArchive = ()=>{
return archive;
}
}
let o1 = new Archiver();
o1.val = 2;
o1.val = 3;
o1.val = 4;
console.log(o1.getArchive());


“ 哪有什么可以直接登顶的人生,只有根据反馈不断迭代个过程”干了这晚鸡汤~~~
-----------------------------------------------------------------------------
补充知识点
// 创建一个对象,其原型指向null, 就没有__proto__属性,也就不会有继承属性
let obj = Object.creat(null);


直接定义的对象,有默认的__proto__, 原型是Object

小小的对象属性值,也是很有意思的~~~