Von MDC:
Object.create(proto [, propertiesObject ])
Dieses ein neues Objekt erstellen, das Prototyp ist Proto ist, das Objekt selbst nichts auf sich selbst definieren hat:
res.foo = function() {
console.log(this);
}
res.foo();
res = proxyResponse(res);
res.foo();
Ergebnis:
{ socket:
{ fd: 7,
type: 'tcp4',
allowHalfOpen: true,
_readWatcher:
{ socket: [Circular],
....
{}
So Warum wirft es keinen Fehler und explodiert? Abgesehen von der verwirrten Eigenschaft, die nachschlagen und einstellen kann, gibt es einen Grund, warum es nicht funktioniert.
Während Ihr neues Objekt auf dasselbe Objekt verweist wie das alte, ist NICHT das alte.
An: https://github.com/ry/node/blob/a0159b4b295f69e5653ef96d88de579746dcfdc8/lib/http.js#L589
if (this.output.length === 0 && this.connection._outgoing[0] === this) {
Dies beendet die Anforderung, this
das neue Objekt ist, aber this.connection._outgoing[0]
verweist immer noch das alte Objekt, so die Anforderung nie fertig gestellt und der Server hängt.
Ich habe immer noch keine Ahnung, was Sie hier erreichen wollen, da es keinen Sinn macht, Object.create
hier zu verwenden, wenn Sie besorgt sind, dass res bei anderen Anfragen überschrieben wird, ist das nicht der Fall da jedes res eine eigene Variable ist, die auf ein anderes Objekt verweist.
Vielen Dank Ivo. Das macht Sinn und sollte etwas sein, das ich mit ein bisschen Jagd durch die Quelle finden konnte. Ich stellte mir vor, dass entweder (a) mit res eine Magie passierte oder (b) eine Lücke in meiner Kenntnis der prototypischen Vererbung bestand. Wie ich vermutet habe, ist letzteres der Fall. Was ich versuchte zu erreichen, war ein Proxy-Design-Muster, wo ich nur eine Funktion für das neue Objekt neu definieren, sagen writeHead, ein paar "Filter" anwenden und den alten res.writeHead am Ende aufrufen. Es sieht so aus, als ob es einen einfacheren Weg gibt, dies zu erreichen. –