2016-08-04 18 views
3

In Javascript, kann ich erkennen, wenn eine globale Variable foo gesetzt ist (unter der Annahme, dass es zunächst nicht definiert ist) unter Verwendung von Object.defineProperty:Wie kann ich feststellen, wenn eine globale Variable in Javascript gesetzt ist?

var foo_; 
Object.defineProperty(window, 'foo', { 
    get: function() { 
    return foo_; 
    }, 
    set: function(newFoo) { 
    console.log('foo set to ' + newFoo); 
    foo_ = newFoo; 
    } 
}); 

Gibt es eine elegantere Möglichkeit, dies zu tun? Ein Nachteil ist, dass ich Object.defineProperty nicht zweimal auf der gleichen Eigenschaft aufrufen kann. Das Überschreiben der gesamten Eigenschaft, nur um zu erkennen, wann sie definiert ist, erscheint etwas übertrieben.

Könnte ich irgendwie proxies verwenden? Ich habe das Gefühl, dass ich einen Proxy machen müsste, der auf das Fensterobjekt zielt, aber ... ist das effizient?

+0

Ich denke, wir können prüfen, ob es in Fensterobjekt wie 'Fenster [foo]' –

+0

Ich möchte den Moment erkennen, wenn die globale Variable gesetzt ist und sagen, etwas zu dieser Zeit protokollieren. –

+0

Das fühlt sich an wie ein asynchroner Hack. Wenn es ist, tu es nicht. Verwenden Sie ein "Versprechen" – 4castle

Antwort

-2

Sie auch wie

var _bar; 
window.__defineGetter__("bar", function(){return this._bar}); 
window.__defineSetter__("bar", function(v){console.log("bar set to:",v); this._bar = v;}); 
+1

Verwenden Sie keine veralteten und nicht standardmäßigen Builtins. – Bergi

0

Gibt es eine elegantere Möglichkeit, dies zu tun tun könnte?

Nicht wirklich. Vielleicht könnten Sie _foo in einer Schließung verstecken (sollten), anstatt eine andere globale Variable zu erstellen.

Ein Nachteil ist, dass ich Object.defineProperty auf der gleichen Eigenschaft nicht zweimal aufrufen kann. Das Überschreiben der gesamten Eigenschaft, nur um zu erkennen, wann sie definiert ist, erscheint etwas übertrieben.

Das einzige Problem ist, dass Sie pass the configurable: true option vergessen haben.

Könnte ich irgendwie Proxies verwenden?

Nein. Sie können das globale Objekt nicht durch einen Proxy ersetzen. Sie können nur den gesamten Code in einen with (new Proxy(…)) { … } Block schreiben.