1. 程式人生 > >Object.defineProperty和proxy

Object.defineProperty和proxy

Object.defineProperty問題

  • Object.defineProperty() 無法監控到陣列下標的變化。vue只能通過以下幾種方法來監聽
pop()
shift()
unshift()
splice()
sort()
reverse()

以上幾種方法也是經過vue內部處理後才能監聽的。

  • 只能劫持物件的屬性,因此我們需要對每個物件的每個屬性進行遍歷

Proxy

特點:

  • 可以劫持整個物件,並返回一個新物件
  • 有13種劫持操作
  • Proxy是es6提供的,相容性不好,無法用polyfill磨平

Proxy使用:

es6提供proxy建構函式,第一個引數target:是所要代理的目標物件,可以是空物件。第二個handler是攔截器,一個攔截器可以有多個攔截操作

var proxy = new Proxy(target, handler);

所有的對target的操作都落在proxy上了。

攔截操作一共有13個

更多攔截操作資訊>>

Reflect

反射:通過類的類型別來操作類的屬性。包含來物件語言內部的方法,一共有13種,和proxy一一對應,如果在Proxy中呼叫Reflect的話,其實對應的就是預設行為。

Proxy的this指向

雖然 Proxy 可以代理針對目標物件的訪問, 但它不是目標物件的透明代理,即不做任何攔截的情況下,也無法保證與目標物件的行為一致。主要原因就是在 Proxy 代理的情況下,目標物件內部的this關鍵字會指向 Proxy 代理。