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

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