🌈 getOwnPropertyDescriptor

var obj = {
	a: 1
}

console.log(Object.getOwnPropertyDescriptor(obj, 'a'));

Untitled

🌈 defineProperty

修改一个已有的属性,或添加一个新的属性

var obj = {};
Object.defineProperty(obj, 'a', {
	value: 2,
  configurable: true,
  writable: true,
  enumerable: true
});
var obj = {};
Object.defineProperty(obj, 'a', {
	value: 2,
  configurable: true,
  writable: false, // 不可写入,但可用 delete 删除
  enumerable: true
});
obj.a = 3; // 写入失败 静默失败,严格模式报错
delete obj.a; // 可以删除
var obj = {};
Object.defineProperty(obj, 'a', {
	value: 2,
  configurable: false, // 禁止配置
  writable: true, // 允许读写
  enumerable: true
})

obj.a = 3; // 可更改

console.log(obj); // { a: 3 }
var obj = {};
Object.defineProperty(obj, 'a', {
	value: 2,
  configurable: false,
  writable: true,
  enumerable: true
})

obj.a = 3;
console.log(obj.a); // 3 更改成功
delete obj.a; //configurable: false 不可以删除
console.log(obj.a); // 3 删除失败

🌈 getter/setter

get 操作、put 操作

let obj = {a: 1}
obj.a; //属性获取 [[Get]] 默认操作, 
// 查找当前属性,然后如果没有查找原型

obj.a = 3; // 赋值操作[[Put]]
// [[Put]]默认操作
1、先看存不存在 getter,setter
2、不存在,再看 writable 是不是 false 不让修改
3、如果不是,就赋值成功

getter / setter

为了改写默认的 [[Get]], [[Put]] 操作

var obj = {
	log: ['a', 'b'],
  get lastest() {
  	if (this.log.length === 0) {
    	return undefined;
    }
    return this.log[this.log.length - 1];
  }
}
console.log(obj.lastest);

Untitled