# 1.数据代理

# Object.defineProperty

Object.defineProperty 是 JavaScript 中用于定义对象属性的方法。通过使用这个方法,你可以更细致地控制属性的行为。该方法接受三个参数:

  1. 对象名(Object): 要定义属性的对象名。
  2. 属性名 (String): 要定义或修改的属性的名称。
  3. 属性描述符 (Object): 包含属性的特性的对象。
// 正常配置对象:
let cat = {
  name:'muggle',
  age:17,
}

// 用Object.defineProperty给对象添加属性
Object.defineProperty(cat, 'sex', {
  value:'male', // 属性的值,
  enumerable:true, // 控制属性是否可以被枚举,默认为false
  writable:true, // 控制属性是否可以被修改,默认为false
  configurable:true // 控制属性是否可以被删除,默认为false
})

# getter和setter

Object.defineProperty第三个参数中,还有两个函数——get和set,get用于获取属性值,set用于修改属性值

let num = 17;
let cat = {
  name:"muggle",
  sex:"male"
}

Object.defineProperty(cat, 'age', {
  get(){
    return num; // 将cat的age属性与变量num绑定
  },
  set(val){ // set接收一个参数,改参数是新的属性值
    num = val; 
  }
})
// 好处:将变量num和cat.age实现双向绑定

// 如何修改:
cat.age = 20; --> 该语句执行时,20会当作实参传递给set函数的val形参。

# 数据代理

通过一个对象代理对另一个对象中属性的操作(读/写)

let muggle = {
  fav:'bread'
}
let daye = {
  hob:'sleep'
}

Object.defineProperty(muggle, 'hob', {
  get(){
    return daye.hob;
  }
  set(val){
  	daye.hob = val
}
})

muggle.hob = 'eat';
daye.hob --> eat  麻瓜代理打野,通过麻瓜把打野的hob修改为eat