2017-06-22 9 views
3

,我們可以讀出來自物體的屬性時,使用此模式創建掛鉤OBJ?如何在讀取對象的屬性時調用函數?如果閱讀<em>任何時候和對象上的所有</em>性質比如有創建一個鉤子的方式</p> <pre><code>const obj = {}; Object.defineProperty(obj, 'x', { get: function() { return require('x'); } }); </code></pre> <p>我很納悶:

例如,當代碼嘗試訪問在obj上不存在的屬性'y'時,掛鉤仍然會被調用。

這是關鍵部分:如果我事先知道對象的所有屬性,我可以循環它們。但是在這種情況下,屬性可能會在稍後添加到對象中,或者可能會讀取未預料的屬性(最終用戶會調用某些意外事件)。

+3

看看['Proxy'](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy) – Andreas

回答

3

我認爲您正在尋找Proxy這是一個新的ECMAScript 2015功能,並允許您爲某些內部方法(如獲取屬性)定義自定義行爲。實施handler.get陷阱允許每當一個屬性進行訪問被稱爲一個特定的功能:

const obj = {}; 
 
const proxyObj = new Proxy(obj, { 
 
    get(target, property, receiver) { 
 
    console.log('accessed'); 
 
    } 
 
}); 
 
proxyObj.foobar; //A property is accessed and the console is logged to

這裏訪問的proxyObj任何屬性將導致日誌在控制檯中。這裏所有的「陷阱」的意思是獲取屬性值爲截獲或陷入,然後你可以在發生時調用自定義行爲。 target這裏是目標對象(obj),property是被訪問的財產,receiver是代理。在這裏運用它,檢查是否propertyy

if(property === 'y') { 
    ... 
} 

如果屬性存在與否,陷阱還是調用沒關係。您可以設置多種其他陷阱,例如設置屬性,使用in運算符,使用delete運算符等。您可以在MDN處看到它們。

1

@Andrew李打我給它,但這裏是一個真實的例子,這是我的使用情況:

//異步和藍鳥庫都安裝在我的本地項目

​​

現在我可以在任何地方注入此代理對象,並且我或最終用戶可以輕鬆訪問依賴關係。目的是讓您不需要預先加載依賴關係,如果您實際上不需要它們。它還可以節省幾行代碼。

相關問題