ES6常用单容易被忽略的方法

1.has
(1)has方法用来拦截HasProperty操作(注意不是HasOwnProperty,即has方法不判断一个属性是对象自身的属性,还是继承的属性。),即判断对象是否具有某个属性时,这个方法会生效。典型的操作就是in运算符。可以接受两个参数,分别是目标对象、需查询的属性名。
(2)用于隐藏某些属性

// 隐藏_开头的属性
var handler = {
  has (target, key) {
    if (key[0] === '_') {
      return false;
    }
    return key in target;
  }
};
var target = { _prop: 'foo', prop: 'foo' };
var proxy = new Proxy(target, handler);
'_prop' in proxy // false

(3)has拦截对for…in循环不生效。

2.construct()
construct方法用于拦截new命令,下面是拦截对象的写法。可以接受三个参数:目标对象、构造函数的参数对象、创造实例对象时,new命令作用的构造函数。construct方法返回的必须是一个对象,否则会报错

3.deleteProperty()
deleteProperty方法用于拦截delete操作,如果这个方法抛出错误或者返回false,当前属性就无法被delete命令删除。目标对象自身的不可配置(configurable)的属性,不能被deleteProperty方法删除,否则报错。

4.defineProperty()
defineProperty()方法拦截了Object.defineProperty()操作。如果目标对象不可扩展(non-extensible),则defineProperty()不能增加目标对象上不存在的属性,否则会报错。另外,如果目标对象的某个属性不可写(writable)或不可配置(configurable),则defineProperty()方法不得改变这两个设置。

5.getPrototypeOf()
(1).方法主要用来拦截获取对象原型,返回值必须是对象或者null,否则报错。
(2).如果目标对象不可扩展(non-extensible), getPrototypeOf()方法必须返回目标对象的原型对象
(3).拦截下面这些操作:
Object.prototype.proto
Object.prototype.isPrototypeOf()
Object.getPrototypeOf()
Reflect.getPrototypeOf()
instanceof

6.vue3使用Proxy替换defineProperty

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章