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

参考《原生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

最新文章

  1. C#单元测试面面观
  2. html代码规范
  3. PLSQL导入Excel表中数据
  4. Marriage Ceremonies(状态压缩dp)
  5. NOIP201205Vigenère密码
  6. [ActionScript3.0] 为内建类添加方法
  7. Unity3D 之3D游戏SD快打 3D游戏基础入门开发全(1)
  8. awk的日志模块追加日期时间字段的方案
  9. npm 常用命令详解[转]
  10. hbulider mui框架
  11. LeetCode第五天
  12. 深入理解this关键字
  13. B-Tree和B+Tree的区别
  14. Linux笔记-top命令和load average
  15. MT【305】丹德林双球
  16. 内部git常用总结
  17. GO-指针与函数
  18. Android Studio之多个Activity的滑动切换(二)
  19. jQuery——实现弹窗
  20. 在js中获取到的页面元素为undefined

热门文章

  1. MySQL操作之DDL
  2. PaperReading20200220
  3. JS 自动返回每个月的天数
  4. Kubernetes 二进制部署(一)单节点部署(Master 与 Node 同一机器)
  5. JDBC--DAO设计模式
  6. ajax请求QQ音乐
  7. ubuntu18.04 LAMP DVWA
  8. sklearn的train_test_split()各函数参数含义解释(非常全)
  9. Linux关于文件处理命令
  10. jmeter之http请求用csv读取中文乱码