監聽JS對象屬性變化 Object.defineProperty Proxy 記錄


引用:https://www.jianshu.com/p/2df6dcddb0d7

https://blog.csdn.net/qq_42833001/article/details/83302149

Object.defineProperty 不足

  • 無法監聽數組的變化: 數組的這些方法是無法觸發set的:push, pop, shift, unshift,splice, sort, reverse.,vue中能監聽是因為對這些方法進行了重寫
  • 只能監聽屬性,而不是監聽對象本身,需要對對象的每個屬性進行遍歷。對於原本不在對象中的屬性難以監聽。
const obj = {};
Object.defineProperty(obj, 'text', {
  get: function() {
    console.log('get val'); 
  },
  set: function(newVal) {
    console.log('set val:' + newVal);
    document.getElementById('input').value = newVal;
    document.getElementById('span').innerHTML = newVal;
  }
});

const input = document.getElementById('input');
input.addEventListener('keyup', function(e){
  obj.text = e.target.value;
})

 

Proxy優點

  • 可以監聽數組變化
  • 監聽的是對象本身
  • 有13種攔截方法
const input = document.getElementById('input');
const p = document.getElementById('p');
const obj = {};

const newObj = new Proxy(obj, {
  get: function(target, key, receiver) {
    console.log(`getting ${key}!`);
    return Reflect.get(target, key, receiver);
  },
  set: function(target, key, value, receiver) {
    console.log(target, key, value, receiver);
    if (key === 'text') {
      input.value = value;
      p.innerHTML = value;
    }
    return Reflect.set(target, key, value, receiver);
  },
});

input.addEventListener('keyup', function(e) {
  newObj.text = e.target.value;
});

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM