2017-06-06 69 views
0

我正在嘗試爲全局瀏覽器窗口對象創建代理。這個想法很簡單 - 如果調用者使用現有的方法或屬性只是返回它,否則使用假對象。下面的代碼:使用JS代理對象時保留'this'上下文

var handler = { 
    get: function(target, name) { 
    return name in window ? 
     window[name] : 
     target[name]; 
    }, 
    set: function(obj, prop, value) { 
    if (prop in window) { 
     window[prop] = value 
    } else { 
     obj[prop] = value 
    }; 
    }, 
}; 

var fakeWindow = new Proxy(function() {}, handler); 
fakeWindow.foo = 'bar'; 
console.log(fakeWindow.foo); // outputs 'bar' 
fakeWindow.alert('hello'); // error - the alert method is called without the correct this value 

問題是,調用代理對象上的方法時(如上面的例子中的警報)中,「這個」值是代理,而不是窗口的那個。 有什麼辦法可以讓這個工作?

+1

返回窗口[名] .bind(窗口) –

+0

只有當它雖然正確的功能? – Dandan

回答

1

您可以結合上下文:

get: function(target, name) { 
if(name in window){ 
if(typeof window[name]==="function") return window[name].bind(window); 
return window[name]; 
} 
return target[name]; 
} 
0

解決方案基於評論從喬納斯寬:

var handler = { 
    get: function(target, name) { 
    return name in window ? 
     (typeof window[name] == 'function' ? window[name].bind(window) : window[name]) : 
     target[name]; 
    }, 
    set: function(obj, prop, value) { 
    if (prop in window) { 
     window[prop] = value 
    } else { 
     obj[prop] = value 
    }; 
    }, 
}; 
+1

因爲有2個三元操作符。 – Dandan

相關問題