数据劫持
+ 是一种给对象添加成员的方式
+ 语法 : Object.defineProperty( 给哪一个对象定义属性 , '键名' , { value: '值' } )const obj = {} // 没有被劫持的数据, 你可以随心所欲的想干啥干啥 // 你想添加就添加, 想改就改, 想删就删, 想访问就访问 obj.age = 18
// 给 obj 这个对象添加一个叫做 gender 的成员 Object.defineProperty(obj, 'gender', { // value 就是给 gender 成员的值 value: '男', }) console.log(obj)
|| ↓↓↓
↓↓↓
↑ ↑ ↑
// 给 obj 这个对象添加一个叫做 gender 的成员 Object.defineProperty(obj, 'gender', { // value 就是给 gender 成员的值 value: '男', // 可枚举 enumerable: true }) console.log(obj) console.log(obj.age) console.log(obj.gender) console.log('age' in obj) console.log('gender' in obj)
默认添加一个不可枚举 属性 :// 给 obj 这个对象添加一个叫做 gender 的成员 Object.defineProperty(obj, 'gender', { // value 就是给 gender 成员的值 value: '男', // 不可枚举 enumerable: false }) console.log(obj) console.log(obj.age) console.log(obj.gender) console.log('age' in obj) console.log('gender' in obj) for(let key in obj) { console.log(key); }
不可枚举 : 被 for in 循环 , 遍历不出来 , 你可以访问 , 可以用 , 但就是遍历不出来
只有将 enumerable 的值 改为 : true , 才可遍历出来
Object.defineProperty(obj, 'gender', { value: '男', // 可枚举 enumerable: true }) console.log(obj) console.log(obj.age) console.log(obj.gender) console.log('age' in obj) console.log('gender' in obj) for(let key in obj) { console.log(key); }
![]()
=> " gender " 数据被劫持了 , 所以看不到
修改被劫持数据 " gender " 的值 :
// 数据劫持 Object.defineProperty(obj, 'gender', { // 这个 get 函数 return 出来的内容, 就是赋值给 gender 的值 get: function() { return '男' } }) console.log(obj) console.log(obj.age) console.log(obj.gender) // 我需要修改 gender 成员的值 obj.gender = '女' console.log(obj.gender)
假如你想修改被劫持的数据的值 :
// 数据劫持 Object.defineProperty(obj, 'gender', { // 这个 get 函数 return 出来的内容, 就是赋值给 gender 的值 get: function() { return '男' } // 这个 set 函数就是当你想修改 gender 这个成员的时候会触发的函数 set(val) { // 对象里函数的简写语法 // 这里可以接受一个形参 : val 就是你想要修改的值 console.log('你想改 gender 成员了') console.log(`你想把 gender 修改成 ${val}`) } }) console.log(obj) console.log(obj.age) console.log(obj.gender)
=> 至于这个东西怎么修改 , 需要 使用 发布订阅
理解例子 : 一个绑匪把你绑架了 , 你的同学想给你送个东西 , 是没有办法直接交到你的手里的 , 你的同学必须要把东西先给到绑匪 , 绑匪同意了 , 才会把东西交到你的手里 .
数据劫持就是我能捕获到你想改的这个行为 , 我也能捕获到你想把他改成什么 , 但就是不给你改 , 这就叫做 数据劫持 . ( 这就是另外一种给对象添加成员的方式 )