当前位置: 首页 > news >正文

监听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;
});

 

转载于:https://www.cnblogs.com/xiaoyuchen/p/10547696.html

相关文章:

  • 读ios开发有感——建立APP开发体系
  • 回归
  • Kubernetes — 重新认识Docker容器
  • 专业术语------扫盲
  • 实验1
  • nunjucks模版引擎入门
  • git flow常用命令
  • PHP实现多维数组按指定值排序
  • 高分笔记_括号匹配
  • 2018-2019-2 《网络对抗技术》Exp2 后门原理与应用 20165211
  • 每日 30 秒 ⏱ 谁敢与我一战
  • 用Python爬取王者农药英雄皮肤
  • 杂记:Python 两坑
  • Sass预处理器常用功能(OneLine周分享)
  • Java程序设计第一次作业
  • 【Amaple教程】5. 插件
  • 2019.2.20 c++ 知识梳理
  • Android框架之Volley
  • golang中接口赋值与方法集
  • in typeof instanceof ===这些运算符有什么作用
  • iOS | NSProxy
  • Javascript编码规范
  • Java-详解HashMap
  • Netty+SpringBoot+FastDFS+Html5实现聊天App(六)
  • Sass Day-01
  • Storybook 5.0正式发布:有史以来变化最大的版本\n
  • supervisor 永不挂掉的进程 安装以及使用
  • 阿里云Kubernetes容器服务上体验Knative
  • 分享自己折腾多时的一套 vue 组件 --we-vue
  • 诡异!React stopPropagation失灵
  • 基于Javascript, Springboot的管理系统报表查询页面代码设计
  • 经典排序算法及其 Java 实现
  • 力扣(LeetCode)56
  • 前端设计模式
  • 详解NodeJs流之一
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​520就是要宠粉,你的心头书我买单
  • ​iOS安全加固方法及实现
  • # 数论-逆元
  • #我与Java虚拟机的故事#连载18:JAVA成长之路
  • (LNMP) How To Install Linux, nginx, MySQL, PHP
  • (笔记)Kotlin——Android封装ViewBinding之二 优化
  • (二)springcloud实战之config配置中心
  • (附源码)springboot人体健康检测微信小程序 毕业设计 012142
  • (转)es进行聚合操作时提示Fielddata is disabled on text fields by default
  • .gitignore
  • .NET Core WebAPI中封装Swagger配置
  • .NET DataGridView数据绑定说明
  • .net MySql
  • .NET 服务 ServiceController
  • .NET/C# 使窗口永不激活(No Activate 永不获得焦点)
  • /dev/sda2 is mounted; will not make a filesystem here!
  • @param注解什么意思_9000字,通俗易懂的讲解下Java注解
  • @SuppressLint(NewApi)和@TargetApi()的区别
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题