2017-06-12 24 views
0

當創建一個JavaScript代理這樣JavaScript代理,從你的目標的內部HOWTO觸發陷阱

var t = function() { 
    self = this; 
    this.a = "abc"; 
    someFunc: function() { 
     self.a = "def"; 
    } 
} 

target = new t(); 

var p = New Proxy(target, { 
    set: function(){ 
     //this will never be called when the someFunc changes the a field. 
     } 
}) 


p.someFunc(); 

設定的「陷阱」將永遠不會被調用我沒有問題,理解爲什麼出現這種情況,但應該如何一個解決這樣的情況?

一個解決辦法是,以暴露自我variale到外面,讓「某人」將其更改爲代理,不是很obviouse使用的T對象的人....

是否有任何其他方式? 我濫用代理嗎?

+0

「*一種解決方案是將自變量暴露在外面*」 - [你已經這麼做](http://blog.niftysnippets.org/2008/03/horror-of-implicit-globals.html )?添加一個'var'!並修復所有其他語法錯誤,如'someFunc:'或'New'。 – Bergi

回答

0

解決辦法是不使用self都:

function T() { 
    this.a = "abc"; 
    this.someFunc = function() { 
     this.a = "def"; // `this` in the method (usually) refers to the proxy 
    }; 
} 

var p = new Proxy(new T, { 
    set: function(target, key, value, receiver) { 
     console.log(key, value); 
     return Reflect.set(target, key, value, receiver); 
    } 
}); 
p.someFunc(); 

如果someFunc不使用代理,你不能把它無需重寫你的T強制。

+0

這可能是這裏的「問題」,someFunct不知道代理的任何內容,也不應該這樣做。這是我猜想的代理概念的一部分。 – PEtter

+0

@PEtter嗯,是的,現在你的[實際問題](https://meta.stackexchange.com/q/66377)是什麼? – Bergi