在node.js中扩展类的不同方法

时间:2014-07-17 17:21:19

标签: javascript node.js

一般在node.js或javascript中扩展原型类。 (js newb)

我正在查看expressjs的源代码并看到this

var mixin = require('utils-merge'); 
....
mixin(app, proto);
mixin(app, EventEmitter.prototype);

Utils-merge似乎是一个外部模块。上面有什么区别,只是做了类似的事情:

var util = require('util');
....
util.inherit(app, proto);
util.inherit(app, EventEmitter);

这是否还在尝试扩展属性?我很善良 - 迷失在这里:

app.request = { __proto__: req, app: app }; // what is the equivalent for this in util?
app.response = { __proto__: res, app: app };

如果是这样,即使使用了util.inherit,它仍会有效吗?

app.request = util.inherit(app, req)

或类似的东西? jshint说__proto__已被删除。


另外我也看到了这个?

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

这可能吗?

var res = module.exports = util.inherits...??

2 个答案:

答案 0 :(得分:6)

  

我正在查看expressjs的源代码

您可能还想了解this question app应该如何运作。

  

utils-merge之间有什么区别   如上所述,只是做了类似的事情:

var util = require('util');
....
util.inherit(app, proto);
util.inherit(app, EventEmitter);

他们做了完全不同的事情:

  

<强> utils-merge
  将源对象中的属性合并到目标对象中。

     

<强> util.inherits

     

将原型方法从一个构造函数继承到另一个构造函数。构造函数的原型将设置为从中创建的新对象   超类。

另请阅读their sources

app(虽然出于奇怪的原因是一个函数)不是构造函数,但应该是{plain}对象 - createApplication生成的实例。所以这里没有办法做“类继承”。并且你不能在同一个构造函数上多次使用utils.inherits,因为它覆盖它的.prototype属性。

相反,mixin函数只会将所有属性从proto复制,然后将所有属性从EventEmitter.prototype复制到app对象。

  

这是否还在尝试扩展属性?我很善良 - 迷失在这里:

app.request = { __proto__: req, app: app }; // what is the equivalent for this in util?
app.response = { __proto__: res, app: app };

使用原生Object.create功能:

app.request = Object.create(req);
app.request.app = app;
app.response = Object.create(res);
app.response.app = app;
  

如果是这样,即使使用了util.inherit,它仍会有效吗?

app.request = util.inherit(app, req) // Or something like that?

不,真的没有。

  

jshint说__proto__已被删除。

是的,您应该使用Object.create代替。但是nonstandard __proto__可能会保留兼容性。

  

另外我也看到了这个?

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

这可能吗?

var res = module.exports = util.inherits...??

不,这是Object.create

的情况
var res = module.exports = Object.create(http.ServerResponse.prototype);

答案 1 :(得分:2)

您可以在Node.js中使用ES6

class myClass() {
  this.hi = function(){"hello"};

}

class myChild extends myClass() {

}

var c = new myChild(); c.hi(); //hello