어떻게 JS로 간단한 데이터 감청을 실현합니까

2323 단어 JS데이터 감청

개요


주로 Object를 사용합니다.defineProperty는 vue와 유사한 데이터 바인딩을 실현합니다.

첫걸음


const data = {
  name: "tom",
  age: 14
}
Object.defineProperty(data, "name", {
  get(){
    return "name "
  },
 set(val){
   console.log(‘ ‘,val)
 }
})
// 
console.log(data.name )
출력된 데이터.name은tom이 아니라name이 읽혔습니다. defineProperty가 데이터의name 필드에 대한 감청 납치로 name 필드가 되돌아와야 할 값을 수정했습니다.

두 번째 단계


const _data = { ...data }
for(let i in data){
  Object.defineProperty(data, i, {
    get(){
      return _data[i]+" js "
    },
    set(val){
      _data[i] = val;
    }
  })
}

왜 단독_data?


대답: 데이터의 필드를 감청하고 필드의 반환 속성을 수정했습니다. 이로 인해 영향은 데이터에서 감청된 필드를 가져올 때마다 브라우저는 get에서 반환된 값을 호출합니다. 만약에 get에서 return 데이터 [i]를 직접 되돌리면 브라우저가 끊임없이 get 방법을 호출하여 사순환에 들어가게 됩니다.

데이터에 데이터를 좀 더 추가하다


const data = {
  name: "tom",
  age: 14,
  friend: {
        "name1": " ",
        "name2": " ",
        "name3": " ",
        "name4": " "
  },
}

초기 값 포맷


const createNewWatch = (val, path, parentKey, event) => {
       // object , 
       if(typeof val != ‘object‘) return val;
       // object , WatchObject, 
       //WatchObject 
       return WatchObject(val,path.concat(parentKey), event)
    }
 https://www.houdianzi.com

object 대상 포맷, 감청 값


const WatchObject = (data, path, event) => {
  function WatchObject(){
    for(var key in data){
        // , val
        data[key] = createNewWatch(data[key], path, key, event)
        // key 
        defineProperty(this, key, data[key], path.concat(key), event)
    }
  }
  return new WatchObject()
}
마지막으로 코드를 실행하면 간단한 데이터 감청이 완성된다.

const b = WatchObject(data,[],{ 
    set(path,val){ 
      console.log(path,val) 
    } 
})
이상은 JS로 간단한 데이터 감청을 실현하는 방법에 대한 상세한 내용입니다. JS 데이터 감청에 관한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

좋은 웹페이지 즐겨찾기