От MDC:
Object.create(proto [, propertiesObject ])
Это создает новый объект, который своего прототипа является прото, объект сам по себе не имеет ничего определить по себе:
res.foo = function() {
console.log(this);
}
res.foo();
res = proxyResponse(res);
res.foo();
Результат:
{ socket:
{ fd: 7,
type: 'tcp4',
allowHalfOpen: true,
_readWatcher:
{ socket: [Circular],
....
{}
Так почему он не бросает ошибку и не взрывается? Помимо искаженного поиска и настройки свойств, есть одна причина, по которой он не работает.
Пока ваш новый объект ссылается на все тот же объект, что и старый, сам НЕ старый.
В: https://github.com/ry/node/blob/a0159b4b295f69e5653ef96d88de579746dcfdc8/lib/http.js#L589
if (this.output.length === 0 && this.connection._outgoing[0] === this) {
Это завершает запрос, this
это новый объект, но this.connection._outgoing[0]
по-прежнему ссылается на старый объект, поэтому запрос никогда не заканчивается и зависания сервера.
Я все еще не знаю, чего вы пытаетесь достичь здесь в любом случае, поскольку здесь нет смысла использовать Object.create
, если вы беспокоитесь о том, что перезапись перезаписывается в случае других запросов, это не тот случай так как каждая res - это собственная переменная, которая ссылается на другой объект.
Большое спасибо Иво. Это имеет смысл и должно было быть чем-то, что я мог найти с небольшой охотой через источник. Я полагал, что либо (а) произошла какая-то магия с res, либо (б) произошла лакуна в моих знаниях о прототипном наследовании. Как я и подозревал, последнее имеет место. То, что я пытаюсь выполнить, было шаблоном проектирования прокси, где я мог переопределить только одну функцию нового объекта, скажем writeHead, применить к нему некоторый «фильтр» и вызвать в конце старый res.writeHead. Похоже, что есть более простой способ сделать это. –