定义
Object.defineProperty(obj, prop, descriptor)
/*
obj:需要定义属性的对象
prop:需要定义的属性
descriptor:属性的描述描述符
返回值:返回此对象
*/
var obj = {}
// 数据描述符
var descriptor = {
// 能否delete删除,
configurable: false,
// 是否可写,默认false, 不能被赋值,只读
writable: false,
// 是否可枚举,即是否可以for...in访问属性,默认false
enumerable: false,
// 属性值,默认undefined
value: 'hello',
// 访问器描述符,不能与数据描述符同时使用
// get: 读取,默认undefined
// set: 设置,默认undefined
}
Object.defineProperty(obj, 'name', descriptor)
console.log(obj.name)
示例:数据响应式 vue
function defineReactive(obj, key, val) {
// val,由于闭包的存在,不会被销毁
Object.defineProperty(obj, key, {
get() {
console.log('get');
return val;
},
set(newVal) {
if (newVal != val) {
console.log('set');
val = newVal;
}
},
});
}
var obj = {};
defineReactive(obj, 'foo', '123')
console.log(obj.foo); // get 123
obj.foo = '223' // set
console.log(obj.foo); // get 223