Object.create()创建的对象使用原型上的方法无效

代码如下:

    const http = require('http');

    const server = http.createServer((req, res) => {
        let r = Object.create(res);

        r.write('HHHHH');
        r.end('OK');
    });

    server.listen(5000, function () {
        console.log('App running!');
    });

之后发送请求就没有有响应了,而且:

    console.log(r.write);
    console.log(res.write);

是一样的结果,r.write === res.write也为true。


    try {
        let o = Object.create(res);

        o.end('<h1>132</h1>', 'utf-8', () => {
            console.log('ok,end')
        });
        res.write('<h1>123456</h1>');
        res.end('<h1>ok</h1>')
    } catch (e) {
        console.error('Error:', e.message);
    }

response的结果是<h1>123456</h1><h1>ok</h1>,然后打出了‘ok, end’.

阅读 2k
2 个回答

res 里的函数调用时有状态的。也就是说,不是已同样的参数调用就一定可以得到同样的结果。

这些状态时一般就是记录在 res 里的。先在,你用 r 来调用 write 跟 end ,会导致状态被写入 r 而不是 res ,从而导致 res 里的状态不正确。除了你的回调函数,没有人知道还有一个 r 存在,他们都会从 res 里读取状态。这会导致 http 的一些内部工作机制无法正常完成,从而引起各种奇怪的行为。

其实我觉得这是个适合初学者的好问题,不过你没表述清楚
你的意思是o 和 res 的方法明明一样,为什么o却不能做res的事情
这里要理解一个概念,js里的函数传参,如果传的是对象,那么传的就是对象的引用(地址),比如

function add(array) {
    array.push(4)
}
let arr = [1,2,3]
add(arr)
console.log(arr) //1,2,3,4

也就是说,你写在createServer函数里的这个res,是调用的人传给你的,你的res怎么变,外面的res也跟着变,这就比传统的return赋值方便的多。你现在建了一个新的对象o,在上面调用再多方法也是没有用的,因为调用你的人不知道你在里面干啥,他只关注传给你的那个res怎么变,结果你复制了个新的对象,没管res,res没变,服务器自然也没有反应。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题