我想了解爲什麼無法使用ES6創建「通用」正向代理。 「通用」我的意思是代理目標可能是任何類型的非原始值(包括函數)與相同的代理聲明(構造函數+處理程序)。ES6「通用」代理
殼體1:
var o = function myCtor() {}
var p = new Proxy({}, {
construct: function(target, ...args) {
return Reflect.construct(o, ...args);
}
});
console.log(new p); // TypeError: p2 is not a constructor
殼體2:
var o = {}
var p = new Proxy(function() {}, {
ownKeys: function(target) {
return Reflect.ownKeys(o);
}
});
console.log(Object.keys(p)); // TypeError: 'ownKeys' on proxy: trap result did not include 'arguments'
案例1個工作正常,當我使用功能(){}作爲代理目標(而不是{}),但是然後,殼體2不再工作了。
感謝您的幫助。
函數具有以下屬性:'length','name''',arguments'''''''''''''''''''''''',看來一個封裝函數的代理需要將'arguments'包含在密鑰列表中。可能有其他的,但解決這個問題就像'return ['arguments',... Reflect.ownKeys(o)]'一樣簡單。 –
@FelixKling騙子! :) –
請參閱https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Proxy/handler/ownKeys#Invariants:*「結果列表必須包含所有不可配置的鍵「* –