2013-06-26 38 views
1

我在Chrome瀏覽器中使用ECMAScript 6代理(需要「啓用實驗JavaScript」標誌)。我粘貼在控制檯下面的代碼(從here拍攝):爲什麼Proxy.create返回「TypeError」

var loggable = function(obj, logger) { 
    return Proxy.create({ 
     get: function get(receiver, prop) { 
      logger.info('Getting ' + prop); 
      return obj[prop]; 
     } 
    }); 
}; 

var person = { name: 'Alice', age: 22 }; 
person = loggable(person, { 
    info: function info(str) { 
     console.log(str); 
    } 
}); 

結果是:

Getting splice 
Getting splice 
"TypeError" 

任何人都可以解釋爲什麼personsplice財產被訪問兩次,爲什麼我們得到"TypeError"

Proxy.create({ 
    get: function get(receiver, prop) { console.log(prop); } 
}); 

Chrome的探測對象,試圖發現它的類型:

+0

所以你只是在代理對象上做'person.splice'?我沒有在Firefox中看到這種行爲,但我還沒有在Chrome中進行過測試。 –

+0

...剛剛在Chrome中測試過,並且它不會產生您在執行'person.splice'時描述的結果。 –

+0

現在我看到我錯過了您在控制檯中進行測試。這是我的承諾...誰在乎控制檯是否有奇怪的東西,只要你的代碼按照預期的方式工作就可以了!控制檯的實現都有不同程度的吸引力。 –

回答

3

您的問題可以簡化。這會觸發get陷阱,並且可以通過在get陷阱中添加console.log(arguments.caller.callee);來顯示。

get: function get(receiver, prop) { console.log(arguments.caller.callee); } 

收益率http://pastebin.com/Fr3ACkJ8。最顯著行是:

 if (typeof obj.splice === "function" && isFinite(obj.length)) 
      return "array"; 

其中顯示了一個嘗試訪問splice財產,你get陷阱捕獲。最後TypeError被記錄,因爲Chrome無法將代理轉換爲可表示的對象。

+0

啊,所以OP在控制檯中測試代碼。我真的希望人們不會這麼做......或者至少會在發佈問題之前在純粹的環境中進行測試。 +1 –

相關問題