高級之路篇六:Object.defineproperty、Proxy與Reflect

1、Object.defineproperty

      屬於es5範疇。該方法會直接在一個對象上定義一個新屬性,或者修改一個對象的現有屬性, 並返回這個對象。

Object.defineProperty(obj, prop, descriptor)

       obj:要在其上定義屬性的對象。

   prop:要定義或修改的屬性的名稱。

   descriptor:將被定義或修改的屬性描述符。

     ------> 缺點:無法監聽數組元素的變動,或者較深層次的複雜對象時會存在無法響應的問題。

2、Proxy

      屬於es6範疇。用於定義基本操作的自定義行爲(如屬性查找,賦值,枚舉,函數調用等)。

let p = new Proxy(target, handler);

      target:Proxy包裝的目標對象(可以是任何類型的對象,包括原生數組,函數,甚至另一個代理)。

   handler:一個對象,其屬性是當執行一個操作時定義代理的行爲的函數。

更多詳情:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Proxy

 

3、Reflect

      屬於es6範疇。它提供攔截 JavaScript 操作的方法。這些方法與處理器對象的方法相同。Reflect不是一個函數對象,因此它是不可構造的。

   Reflect沒有構造函數。你不能將其與一個new運算符一起使用,或者將Reflect對象作爲一個函數來調用。Reflect的所有屬性和方法都是靜態的(就像Math對象)。如:

Reflect.apply(target, thisArgument, argumentsList)

      target:目標函數。

      thisArgument:target函數調用時綁定的this對象。

      argumentsList:target函數調用時傳入的實參列表,該參數應該是一個類數組的對象。

Reflect.get(target, propertyKey[, receiver])

      target:需要取值的目標對象

   propertyKey:需要獲取的值的鍵值

      receiver:如果遇到 getter,此值將提供給目標調用。

......

更多詳見:https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Reflect

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