1、Object.defineProperty();
Object.defineProperty(对象,属性,描述符/特性); -> 设置对象属性的特性,默认特性为:可读、可写、可配置、可枚举; -> ES3/5中该方法只做底层使用,ES6开放给开发者使用;
- - - >>> 作用:其是双向数据绑定的核心方法,主要做数据劫持操作(监控属性变化),同时也是后期ES6中很多语法糖底层实现的核心方法;
补充: 日常开发中“对象属性特性”的应用 -> ES3/5经常会遇到某类现象,底层实现便是“对象属性特性”的应用,例如var/let声明的变量,是不能进行删除的,就是因为该属性是“不可配置”的;
for(var prop in Object.prototype){ console.log(prop);};//遍历不到 -> 其不可枚举
2、数据劫持 -> 巧妙应用Object.defineProperty();中的get();set();监控对象属性的变化;
(1).VUE双向数据绑定核心功能由 Observer、Compile、Watcher三部分实现,其中Observer部分功能实现由Object.defineProperty实现 ->Observer:监测数据变化进行相应回调(数据劫持);
(2).数据劫持核心便是调用Object.defineProperty();中的get();set();方法;其只能监控"对象属性"的改变,监控数组需另行处理,而且对象新增属性也无法有效监控,因此ES6推出更完善的Proxy代理,Reflect映射,但其的兼容性不好(新内容),VUE3.0才开始使用,3.0之前采取的还是老方法;
3、Proxy、Reflect:其比“数据劫持”更加完善,可监控对象及数组的属性变化,同时对象新增属性也可有效监控,但其兼容性不好 -> ES6新增语法,并非语法糖,使用babel工具进行语法降级也不能全部转换为ES5语法,因此其的兼容性不是很好;
网友评论