什么是观察者模式?
答:在数据发生改变时,对应的处理函数自动执行。函数自动观察数据对象,一旦对象有变化,函数就会自动执行。

参考《原生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实现)的更多相关文章

  1. JavaScript使用Object.defineProperty方法实现双数据绑定

    Object.defineProperty这个方法非常值得学习,很多mvc框架中的双向数据绑定就是通过它来实现的. 本着互联网分享精神,今天我就将我自己的见解分享给大家,希望能有所帮助. 开始使用 O ...

  2. javascript之Object.defineProperty的奥妙

    直切主题 今天遇到一个这样的功能: 写一个函数,该函数传递两个参数,第一个参数为返回对象的总数据量,第二个参数为初始化对象的数据.如: var o = obj (4, {name: 'xu', age ...

  3. javascript 之 Object.defineProperty

    语法: Object.definePropty(obj,prop,descriptor); 参数: obj:要在其上定义属性的属性 prop:要定义或修改的属性的名称 desriptor:将被定义或修 ...

  4. vue Object.defineProperty Proxy 数据双向绑定

    Object.defineProperty 虽然已经能够实现双向绑定了,但是他还是有缺陷的. 只能对属性进行数据劫持,所以需要深度遍历整个对象 对于数组不能监听到数据的变化 虽然 Vue 中确实能检测 ...

  5. 双向绑定Proxy VS Object.defineProperty

    Vue3.0的双向绑定将使用Proxy代替Object.defineProperty,据尤大说,速度提升了1倍. 本文我们来探讨一下Proxy对比Object.defineProperty究竟有哪些优 ...

  6. Object.defineProperty和proxy

    Object.defineProperty问题 Object.defineProperty() 无法监控到数组下标的变化.vue只能通过以下几种方法来监听 pop() shift() unshift( ...

  7. javascript的Object对象的defineProperty和defineProperties

    Object的属性 查看官网:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Obje ...

  8. Javascript Object.defineProperty()

    转载声明: 本文标题:Javascript Object.defineProperty() 本文链接:http://www.zuojj.com/archives/994.html,转载请注明转自Ben ...

  9. JavaScript Object.defineProperty()方法详解

    Object.defineProperty() 方法直接在一个对象上定义一个新属性,或者修改一个已经存在的属性, 并返回这个对象. 语法 Object.defineProperty(obj, prop ...

随机推荐

  1. mathematica练习程序(第一章 Mathematica的基本量)

    虽然过去有用Mathematica解过一些问题,不过对这个语言并没有系统学习过. 所以最近想重新把Mathematica系统的学一遍. 偶然在B站上找到了这样一组教程:https://www.bili ...

  2. 一探torch.nn究竟“What is torch.nn really?”

    来自: https://pytorch.org/tutorials/beginner/nn_tutorial.html <What is torch.nn really?>这文章看起来不能 ...

  3. SpringCloud实战——(4)基于Eureka、Zuul

  4. DatePicker和DataPickerDialog以及AutoCompleteTextView的基本使用方法

    1.DatePicker和DatePickerDialog的基本使用方法: main.xml: <?xml version="1.0" encoding="utf- ...

  5. 在网页中JS函数自动执行常用三种方法

    在网页中JS函数自动执行常用三种方法 在HTML中的Head区域中,有如下函数: <SCRIPT   LANGUAGE="JavaScript">   function ...

  6. 700k把web端程序包装为桌面程序

    electron因为自带cef所以体积巨大,还不是因为windows没有chromium的webview嘛,现在有了新edge后,这个项目通过依赖各个平台的webview,并依赖.net core,做 ...

  7. Codeforces 1296E2. String Coloring (hard version)

    这道题和HDU1257一模一样,一开始窝都用贪心直接解,没法理解为什么求一个最长下降序列,直到看了巨巨的题解,先给出一个定理,Dilworth's theorem,离散学不好,补题两行泪,该定理是说, ...

  8. spingboot中使用scheduled设置定时任务注意事项

    在spring开发过程中经常会遇到需要定时执行的任务,如定时生成报表,定时推送消息等任务. springboot 提供了简单的 @Scheduled 表达式来配置定时任务.该方式默认是单线程的,任务在 ...

  9. R box-cox变换 《回归分析与线性统计模型》page100

    > rm(list = ls()) > library(openxlsx) > electric= read.xlsx("data101.xlsx",sheet ...

  10. Java的equals方法的使用技巧

    Java的equals方法的使用技巧 1.业务场景: 在某个社交软件中,要求每个用户的用户名(name)必须独一无二,那么在每次增加新用户的时候,都要对该用户的注册名进行判断,如果当前用户名已经被占用 ...