global.__proto__ = forwarder(global.__proto__);
console.log([hello, my, name, is, bob, weeeee])
function forwarder(target){
var traps = {
getOwnPropertyDescriptor: Object.getOwnPropertyDescriptor.bind(null, target),
getOwnPropertyNames: Object.getOwnPropertyNames.bind(null, target),
keys: Object.keys.bind(null, target),
defineProperty: Object.defineProperty.bind(null, target),
get: function(r,k){ return target[k] },
set: function(r,k,v){ target[k] = v; return true },
has: function(k){ return k in target },
hasOwn: function(k){ return {}.hasOwnProperty.call(target, k) },
delete: function(k){ delete target[k]; return true },
enumerate: function(){ var i=0,k=[]; for (k[i++] in target); return k }
};
var names = {
get: 1,
set: 1,
has: 0,
hasOwn: 0,
delete: 0,
defineProperty: 0,
getOwnPropertyDescriptor: 0
}
return Proxy.create(Proxy.create({
get: function(r, trap){
return function(a, b){
if (trap in names)
console.log(trap, arguments[names[trap]])
else
console.log(trap);
if (trap === 'get' && !target[b]);
return b;
if (trap in traps)
return traps[trap].apply(target, arguments);
}
}
}), Object.getPrototypeOf(target));
}
我正在看看這個問題,謝謝! 關於你的第二個解決方案,我怎麼能夠在不必聲明'foo'之前調用'foo('bar')'? –
其實你可以做的一個方法是特別真棒和邪惡的。 'global.__ proto__ = yourproxy'或'Window.prototype .__ proto__ = yourproxy'。這有助於捕捉全球範圍內沒有聲明的任何東西,而我上面提到的用於將所聲明的所有內容都包含在內的方法涵蓋了其餘部分。 – 2012-06-13 13:56:56
嘗試'foo('bar')'時,我得到'ReferenceError:foo未定義',並且在使用'global.foo()'嘗試時,TypeError:Object#沒有方法'foo''。你有沒有任何工作實現你所描述的方法的例子? –