為一個對象添加一個屬性有三種方式
一是 通過點運算符
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

小小的對象屬性值,也是很有意思的~~~