Warum kann ich nicht die Tasche aller in JOREJS verlängern?
-
28-10-2019 - |
Frage
Ich versuche, Funktionen in allen zu liefern pocket
von Nowjs. Ich würde gerne tun _.extend
aller Tasche, dh everyone.now
. Aus irgendeinem Grund, den ich nicht verstehen kann, _.extend
kann die Funktion auf der Clientseite nicht ordnungsgemäß bereitstellen.
Dies ist mein aktueller Code:
var _ = require("underscore"),
everyone = require("nowjs").initialize(app);
everyone.now.foo = function() {};
_.extend(everyone.now, {
bar: function() {}
});
console.log(everyone.now.foo); // [Function]
console.log(everyone.now.bar); // undefined
Sowohl auf dem Server als auch auf den Client -Seiten kann ich tun now.foo()
Alles gut. Auf der anderen Seite, now.bar()
scheitert, weil now.bar
ist nicht definiert. Dies ist sowohl auf den Client- als auch auf der Server -Seite der Fall. Ich habe versucht, auf der Serverseite auf die Existenz zu suchen, wie oben in der letzten Zeile gezeigt. Diese Zeilenprotokolle protokolliert jedoch undefined
.
Unterstreicht extend
Funktion (offensichtlich) arbeitet an anderen Objekten, daher hat es wohl etwas mit dem "magischen Namespace" zu tun, den jetzt Js verwendet.
Wie kommt es, dass sich die Verlängerung nicht funktioniert everyone.now
Und wie kann ich es zum Laufen bringen?
Bearbeiten 2: Ich habe noch mehr in Stellvertreter gegraben. Es scheint, als würde eine Eigenschaft auf einem Proxy festgelegt, indem eine Variable übergeben wird, da der Name nicht funktioniert. Ich habe meine erste Bearbeitung entfernt, weil dieser Testfall stärker eingeschränkt ist.
Warum funktioniert das nicht? Ist das ein Fehler? (Meistens frage ich das selbst, ich weiß, dass es nicht ist, aber das macht mich wirklich ahnungslos ...)
var proxy = Proxy.create({
get: function(pr, name) {
console.log("get called");
return null;
},
set: function(pr, name, value) {
console.log("set called");
}
});
var key = "foo";
proxy["foo"] = "bar";
proxy[ key ] = "bar";
proxy["foo"];
proxy[ key ];
Protokollergebnis:
set called
get called
get called
Offenbar, proxy[ key ] = "bar";
verursacht nicht set
auf den Stellvertreter gerufen werden. Warum ist das so?
Lösung
Sie postete einen Blogeintrag Auf der NOWJS -Website zur Verwendung node-proxy
unter Windows anstelle der nativen V8 -Implementierung mit dem --harmony_proxies
Flagge.
Es schien, dass die V8 -Version, die Knoten derzeit verwendet, mehrere Fehler in Bezug auf Proxys enthält, die das seltsame Verhalten verursachten, wie in der Frage beschrieben. node-proxy
, Es ist jedoch ein Modul, das Proxies ermöglicht (der Kern des "magischen Namespace" von Nowjs) ohne diese Fehler. (Die Fehler sind auch in einer neueren Version von V8 behoben, aber das würde einen benutzerdefinierten Knoten erfordern.)
Ich konnte einfach nicht herausfinden, wie ich bauen sollte node-proxy
unter Windows (es ist ein .node
hinzufügen Auf; Kein reines JavaScript). Im obigen Blog -Beitrag haben sie das kompilierte Modul verteilt, und alles funktioniert jetzt wie ein Zauber.
Reparieren:
- Download das kompilierte Modul
- Extrahieren Sie den Ordner an die
node_modules
Ordner und benennen es um umnow
- Führen Sie keinen Knoten mit der Proxy -Flagge aus
Bearbeiten: Knoten 0.7.0 verwendet V8 3.8.6, was dieses Problem ebenfalls löst. Einfach mit dem laufen --harmony
Fahnen Sie und entfernen Sie den Verweis auf node-proxy
.