Javascript观察者模式(Object.defineProperty、Reflect和Proxy实现)
什么是观察者模式?
答:在数据发生改变时,对应的处理函数自动执行。函数自动观察数据对象,一旦对象有变化,函数就会自动执行。
参考《原生JavaScript实现观察者模式》(https://blog.csdn.net/lm278858445/article/details/78287492),注释了代码,如下:
ES5:Object.defineProperty
let friend={}
//那篇博客没有定义name,所以编译器会报错
let age="jin"
//定义 name 属性及 set 和 get 方法
//存取描述符(get,set)
//数据描述符(value,writable)
//Object.defineProperty(obj, prop, descriptor)
Object.defineProperty(friend,"age",{
//当且仅当该属性的enumerable为true时,
// 该属性才能够出现在对象的枚举属性中。默认为 false。
enumerable:true,
//当且仅当该属性的 configurable 为 true 时,
// 该属性描述符才能够被改变,同时该属性也能从对应的对象上被删除。
// 默认为 false。
configurable:true,
get:function () {
return age
},
set:function (newValue) {
//调用改变时的函数
// 当对象的属性改变时,会执行 set 方法
console.log("age属性从"+age+"转变为"+newValue)
age=newValue
}
})
friend.age="chen"
friend.age="yu"
console.info('friend',friend)
关于「defineProperty」的详细解释,请参考(https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Object/defineProperty)
ES6:使用set方法实现
//ES6
//使用set方法实现
//注意,定义类 首字母必须大写
let age="ccc" class Friend{
constructor(age){
this.age=age
} set age(newValue){
console.log("age属性从"+age+"转变为"+newValue)
age=newValue
}
} let friend=new Friend("aaa")
friend.age="bbb"
console.log(friend)

ES6:使用Reflect和Proxy实现
class Friend{
constructor(age){
this.age=age
}
}
let friend=new Friend("chen")
//proxy 代理
let changeValueProxy=new Proxy(friend,{
// set(target,property,value,receiver){
set(target,property,value,receiver){
if(property==="age"){
console.log(`age从${target[property]}转变成${value}`)
}
// Reflect.set方法设置target对象的name属性等于value。
//如本例是 age,则设置 friend(target) 的 age 属性(property)
//为 value
//如果不写这个,则 friend 的 age 值依然是 chen
Reflect.set(target,property,value,receiver)
//这样写也可以
// Reflect.set(friend,"age",value,receiver)
}
})
changeValueProxy.age="jin"
console.log(friend)

原文:https://www.jianshu.com/p/b7babe28ec4a
Javascript观察者模式(Object.defineProperty、Reflect和Proxy实现)的更多相关文章
- JavaScript使用Object.defineProperty方法实现双数据绑定
Object.defineProperty这个方法非常值得学习,很多mvc框架中的双向数据绑定就是通过它来实现的. 本着互联网分享精神,今天我就将我自己的见解分享给大家,希望能有所帮助. 开始使用 O ...
- javascript之Object.defineProperty的奥妙
直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...
- javascript 之 Object.defineProperty
语法: Object.definePropty(obj,prop,descriptor); 参数: obj:要在其上定义属性的属性 prop:要定义或修改的属性的名称 desriptor:将被定义或修 ...
- vue Object.defineProperty Proxy 数据双向绑定
Object.defineProperty 虽然已经能够实现双向绑定了,但是他还是有缺陷的. 只能对属性进行数据劫持,所以需要深度遍历整个对象 对于数组不能监听到数据的变化 虽然 Vue 中确实能检测 ...
- 双向绑定Proxy VS Object.defineProperty
Vue3.0的双向绑定将使用Proxy代替Object.defineProperty,据尤大说,速度提升了1倍. 本文我们来探讨一下Proxy对比Object.defineProperty究竟有哪些优 ...
- Object.defineProperty和proxy
Object.defineProperty问题 Object.defineProperty() 无法监控到数组下标的变化.vue只能通过以下几种方法来监听 pop() shift() unshift( ...
- javascript的Object对象的defineProperty和defineProperties
Object的属性 查看官网:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Obje ...
- Javascript Object.defineProperty()
转载声明: 本文标题:Javascript Object.defineProperty() 本文链接:http://www.zuojj.com/archives/994.html,转载请注明转自Ben ...
- JavaScript Object.defineProperty()方法详解
Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法 Object.defineProperty(obj, prop ...
随机推荐
- kill和raise
kill向特定的进程和进程组发送信号 raise向进程自身发送信号
- 02-02Android 学习进度报告二
今天我主要学习了Android的UI基础布局知识,主要是学习View与ViewGroup的概念以及其区别. 首先是代码说明: <?xml version="1.0" enco ...
- vue2 Excel导出数据 js-xlsx的使用
vue2 Excel导出数据 js-xlsx的使用 https://www.jianshu.com/p/ea115a8e9107 小世界最温暖 关注 2018.11.19 16:08 字数 280 阅 ...
- Outer()函数
转载:https://bbs.pinggu.org/thread-7078237-1-1.html R语言中的outer()函数,名为内积函数,但是他执行的功能并不是解析几何中的内积.那该函数到底发挥 ...
- 「SDOI2015」寻宝游戏
传送门 Luogu 解题思路 发现一个性质: 对于所有的宝藏点 \({a_1,a_2...a_k}\) ,按照dfs序递增排列,答案就是: \(dis(a_1, a_2) + dis(a_2, a_3 ...
- 分页--pagination.js
var pagination = function (thispage, totalpage, ulele, firstlast) { ulele.html(''); var prevCss, nex ...
- 软件环境常识 --dev sit uat
DEV环境:DEV顾名思义就是develop,即代码开发的环境. SIT环境:System Integration Test系统集成测试,开发人员自己测试流程是否走通. UAT环境:User Acce ...
- Ubuntu操作系统编写zabbix的启动管理脚本
Ubuntu操作系统编写zabbix的启动管理脚本 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.修改zabbix的pid存放路径 1>.创建存放zabbix的pid目录 ...
- Kubernetes Dashboard 【转】
前面章节 Kubernetes 所有的操作我们都是通过命令行工具 kubectl 完成的.为了提供更丰富的用户体验,Kubernetes 还开发了一个基于 Web 的 Dashboard,用户可以用 ...
- HihoCoder 1246:王胖浩与环
#1246 : 王胖浩与环 时间限制:6000ms 单点时限:1000ms 内存限制:256MB 描述 王胖浩有一个环,环上有n个正整数.他有特殊的能力,能将环切成k段,每段包含一个或者多个数字. 对 ...