2016-11-28 53 views
1

在這段代碼handlet.set在ES6代理返回值

function report(message) { 
    console.log(message); 
} 
function makeLoggable(target) { 
    return new Proxy(target, { 
    get(target, property) { 
     report(`Reading ${property}`); 
     const param = target; 
     return param[property]; 
    }, 
    set(target, property, value) { 
     report(`Writing value ${value} to ${property}`); 
     const param = target; 
     return param[property] = value; 
    }, 
    }); 
} 
let ninja = { name: 'Jack' }; 
ninja = makeLoggable(ninja); 
console.assert(ninja.name === 'Jack', 'Our ninja Jack'); 
ninja.status = ''; 

我有兩個問題:

1)爲什麼如果我設置的最後一行的財產狀況值在0或「 「(空字符串)我得到一個錯誤

Uncaught TypeError: 'set' on proxy: trap returned falsish for property 'status'(…)

2)在說明書中說我應該返回一個布爾值。但在我的情況下,在set()方法中,我不返回任何布爾值。在那種情況下爲什麼這個代碼有效?

+0

這裏分配不涉及比較? – Drylozav

回答

4

您正在收到TypeError,因爲""是虛假的。如果您嘗試將屬性值設置爲0false,則會收到相同的錯誤。

由於MDN states

In strict mode, a false return value from the set handler will throw a TypeError exception.

MDN是有些不清楚這裏,因爲它出現任何falsy值(不只是false)將導致一系列處理程序拋出一個TypeError。

您的代碼適用於大多數情況,因爲您正在返回賦值結果。 ninja.test = 'string'將返回string這是truthy。

爲了解決這個問題,簡單地改變你的設置功能於以下內容:

set(target, property, value) { 
    report(`Writing value ${value} to ${property}`); 
    const param = target; 
    param[property] = value; 
    return true; 
} 
+0

但在這種類型轉換髮生在什麼樣的?我的意思是從字符串到布爾值。我在規範中找不到任何解釋。 – Drylozav

+1

@Drylozav從集合處理程序返回後,它看起來發生在內部。 – Gerrit0