\ue50a2019-10-09　00:14:14　\ue50b　双向数据绑定简易版本如何应用　defineProperty　的getter　setter　方法　有这样HTML片段

var　obj　=　{};　var　bind　=　[];　Objec...　双向数据绑定简易版本如何应用defineProperty的getter　setter　方法　有这样HTML片段　<　input　type　="text"　id　="demo"　>　<　p　id　="display"　>　var　obj　=　{};　var　bind　=　[];　Object.defineProperty(obj,　's'　,　{　set:　function　(val){　bind[　's']　=　val;　},　get:　function　(){　return　bind['s'var　demo　=　$('#demo'　);　var　display　=　$('#display'　);　demo.keyup(　function　(event)　{　/*　Act　on　the　event　*/　obj[　's']　=　demo.val();　display.html(bind[　's'对对象obj['s']　=　demo.val(); 　触发defineProperty的set方法 　对bind['s']　赋值为demo的值。　转载于:https://www.cnblogs.com/junwu/p/7274034.html　vue　3.0之前通过Object.　defineProperty　数据劫持来实现数据监听,　vue　3.0即将引入Proxy来实现。　//添加观察者　const　queuedObservers　=　new　Set();　const　observe　=　fn　=>　queuedObservers.add(fn);　//创建prox...　Proxy实现观察者模式(vue3.0)　vue3.0之前通过Object.defineProperty数据劫持来实现数据监听,vue3.0即将引入Proxy来实现。　//添加观察者　const　queuedObservers　=　new　Set　(　)　;　const　observe　=　fn　=>　queuedObservers　.　add　(　fn　)　;　//创建proxy代理　const　observable　=　obj　=>　{　for　(　const　[　key　,　value　]　of　Object　.　entries　(　obj　)　)　{　if　(　value　instanceof　Object　)　{　obj　[　key　]　=　observable　(　obj　[　key　]　)　}　}　return　new　Proxy　(　obj　,　{　set　:　(　target　,　key　,　value　,　receiver　)　=>　{　const　result　=　Reflect　.　set　(　target　,　key　,　value　,　receiver　)　;　queuedObservers　.　forEach　(　observer　=>　observer　(　)　)　;　return　result　被观察的　对象　const　person　=　observable　(　{　name　:　'张三'　,　age　:　20　,　s　:　{　a　:　{　d　:　1　}　}　,　a　:　{　s　:　1　}　}　)　;　function　print　(　)　{　console　.　log　(　`　${　person　.　name　}　,　${　person　.　age　}　`　)　}　function　print2　(　)　{　console　.　log　(　`我是二号观察者:　${　person　.　name　}　,　${　person　.　age　添加观察者　observe　(　print　)　;　observe　(　print2　)　;　person　.　s　.　a　.　d　=　2　;　谈谈Object.defineProperty的缺点:　不能监听数组变化　必须遍历对象每个属性　同理深度遍历为对象的属性　Object.defineProperty监听的目标是对象属性,proxy目标是对象,也就省去了属性的遍历,然而免不了深度监听为对象的属性。　Object.defineProperty的一些描述符属性:　configurable为false时候,对象属性将不能被delete,并且在严格模式下会跑出错误　Object　.　defineProperty　(　person　,　'name'　,　{　configurable　:　false　,　value　:　'John'　}　)　Writable为fasle,将不能被直接修改,可以通过defineProperty修改;　Enumerable为false的属性将不能被枚举。　11月16日早上,　Vue　.js的作者尤大大在　Vue　Toronto　的主题演讲中预演了　Vue　.js　3.0的一些新特性,其中一个很重要的改变就是　Vue　3　将使用　ES6的Proxy　作为其观察者机制,取代之前使用的Object.　defineProperty　。...　写在前面:　11月16日早上,Vue.js的作者尤大大在　Vue　Toronto　的主题演讲中预演了 Vue.js　3.0的一些新特性,其中一个很重要的改变就是Vue3　将使用　ES6的Proxy　作为其观察者机制,取代之前使用的Object.defineProperty。