首先提出一个问题:假如你现在需要封装一个数据对象,这个数据呢,只能让内部的方法访问到,其他的api是无法访问到的,你会怎么做?
我们知道,对于Java,C#等语言,它们都存在私有属性(private),限制只有对象(或者类)内部的方法才能访问到。但是对于ES6之前的javascript,虽然也可以模拟实现,但是会比较麻烦,直到ES6中的proxy出现后,才简单了许多。下面我们来看看ES3-ES6是怎么实现对象代理(数据保护)的:
以下代码范例都是以保护一个数据对象中的 sex 属性为例!
es3
先看看 ES3 的实现方式,基于构造函数 Person 中的局部作用域实现:
1 | var Person = function(){ |
我们看看输出结果:
从上图可以看出,sex 属性是保护的,所以修改是不成功的,name 和 age 属性被成功修改。
可以看出,这样只写是炒鸡麻烦的~
es5
我们再看看 ES5 中的实现方式,基于 Object.defineProperty() 方法,该方法会直接在一个对象上定义一个新属性,或者修改一个对象的现有属性, 并返回这个对象:
1 | var Person = { |
我们看看输出结果:
可以看出,ES5中的实现方式比ES3中简单了许多,但是还不够,因为当涉及保护的数据非常多的时候,这样写还是比较麻烦,而且不能设定规则,要么只读,要么可写,非常绝对,没办法让它什么情况下只可读,什么情况下可写等。
es6
最后看看ES6中的实现方式,基于proxy:
1 | let Person = { |
我们同样看看输出结果:
可以看到,我们通过 Proxy 让新的对象 person 代理需操作的 Person 对象,只暴露 person 对象给外部进行读写和修改,并且在 get 和 set 方法中进行逻辑的控制、限制等,既不影响原来的对象 person,又跟业务逻辑隔离,是个非常棒的原生方法。
完~