Skip to content

Instantly share code, notes, and snippets.

@MarshalW
Created May 15, 2022 03:30
Show Gist options
  • Save MarshalW/9996f8f03d0bcd7f6699c0a17a6a6044 to your computer and use it in GitHub Desktop.
Save MarshalW/9996f8f03d0bcd7f6699c0a17a6a6044 to your computer and use it in GitHub Desktop.
javascript/typescript proxy 使用示例

javascript/typescript proxy 使用示例

let info: any = {}

// 直通
let proxy = new Proxy(info, {})
proxy.name = 'test'
console.log(info.name)

// 嵌套
let proxy2 = new Proxy(proxy, {})
proxy2.name = 'test2'
console.log(info.name)

// get
let proxyForGet = new Proxy(info, {
  get(target, property) {
    if (property === 'name') {
      if (property in target) {
        return `name: ${target[property]}`
      }
      return '--'
    } else {
      return target[property]
    }
  }
})
console.log(proxyForGet.name)

proxyForGet.name2 = 'name2'
console.log(proxyForGet.name2)

// set
let proxyForSet = new Proxy(info, {
  set(target, property, val) {
    if (property === 'title') {
      target[property] = val + '!!'
    }
    return true
  }
})
proxyForSet.title = 'ok'
console.log(proxyForSet.title)

// ownKeys
info._password = '***'
let proxyOwnKeys = new Proxy(info, {
  ownKeys(target) {
    return Object.keys(target).filter(key => !key.startsWith('_'));
  }
})
for (let key in proxyOwnKeys) console.log('==>' + key);
console.log(`==>>values: ${Object.values(proxyOwnKeys)}`)
console.log(`==>>password: ${proxyOwnKeys._password}`)

// has
let range = {
  start: 1,
  end: 10
};
range = new Proxy(range, {
  has(target, prop:any) {
    return prop >= target.start && prop <= target.end;
  }
});
console.log(5 in range)
console.log(12 in range)
console.log('a' in range)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment