Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
451 views
in Technique[技术] by (71.8m points)

javascript - In Express and Node.js, is it possible to extend or override methods of the response object?

With every middleware, Express passes a res and a req objects. These objects extend the native ones that come from http.ServerResponse and http.ClientRequest respectively. I'd like to know if it's possible to override or extend methods of the response object.

For example, instead of res.render('home', jsonData);, I'd like to extend res with a custom method called customRender and use it like so: res.customRender().

I'm not stuck at a particular problem or anything. I'd just like to learn how to extend native objects or, as with this case, object that come from 3rd party modules in Node.js

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

The best idea would be to add a custom method to the prototype of the response object:

var express = require("express");

express.response.customRender = function() {
    // your stuff goes here
};

And this function should be accessible by every res object.

You can read the source code to see how they extend native objects. Basically they are doing prototype chaining:

express/lib/response.js

var res = module.exports = {
  __proto__: http.ServerResponse.prototype
};

And this object becomes a prototype of newely created response object (which comes from connect framework):

res.__proto__ = app.response;

(app.response is just an alias to res defined above). Note that __proto__ property is a reference to the prototype of an object.

Be warned though. First of all __proto__ is not a part of EcmaScript (it might not be available in other JavaScript implementations). Secondly: normally you would do inheritance with Object.create (setting __proto__ directly on an object is a monkey patching and it is generally a bad practice, it may break many things). Read more about that here:

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Guide/Inheritance_and_the_prototype_chain


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...