什么是观察者模式?
答:在数据发生改变时,对应的处理函数自动执行。函数自动观察数据对象,一旦对象有变化,函数就会自动执行。
参考《原生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