最早认识这个函数,源于对vue双向绑定的探索,vue通过这个函数实现属性挟持并结合发布者-订阅者模式实现双向绑定
先看一个实例:
var o= {name: 'a'} Object.defineProperty(o, 'value', { value: 3, writable: true, enumerable: true, cofigurable: true }) console.log(o.value) //3
三个参数,分别是目标对象、属性名称、参数对象
value:属性值
writable:属性是否可改写,默认false
enumerable:是否可在for..in循环中被列举或通过Object.keys列举,默认false
cofigurable:总开关,设为false后其他属性无效,默认false
而此函数最主要的用法,在于其可以设置get、set函数对取值、赋值行为进行监控并操作,(可称之为属性挟持,这个属性被此函数强制掌控了!)
Object.defineProperty(o, 'value1', { get: function(){ console.log("我挟持了获取操作") return value1 }, set: function(newValue){ console.log("我挟持了赋值操作") value1= newValue } }) o.value1= '1' console.log(o.value1)
1