如何从Node.js中的另一个文件正确创建原型对象?

时间:2013-02-03 23:47:25

标签: javascript node.js

我在Node.js中遇到了一个非常令人沮丧的问题。

我将从我正在做的事情开始。

我正在文件中创建一个对象,然后导出构造函数并在其他文件中创建它。

我的对象定义如下:

文件1:

var Parent = function() {};

Parent.prototype = {
     C: function () { ... }
}

module.exports = Parent;

文件2:

var Parent = require('foo.js'),
      util = require('util'),
      Obj = function(){ this.bar = 'bar' };
util.inherits(Obj, Parent);
Obj.prototype.A = function(){ ... };
Obj.prototype.B = function(){ ... };
module.exports = Obj;

我正在尝试在另一个文件中使用这样的对象

文件3:

var Obj = require('../obj.js'),
      obj = new Obj();

obj.A(); 

我收到错误:

TypeError: Object [object Object] has no method 'A'

然而,当我运行Object.getPrototypeOf(obj)时,我得到:

{ A: [Function], B: [Function] }

我不知道我在这里做错了什么,任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:4)

我无法重现你的问题。这是我的设置:

<强> parent.js

var Parent = function() {};

Parent.prototype = {
  C: function() {
    console.log('Parent#C');
  }
};

module.exports = Parent;

<强> child.js

var Parent = require('./parent'),
    util = require('util');

var Child = function() {
  this.child = 'child';
};

util.inherits(Child, Parent);

Child.prototype.A = function() {
  console.log('Child#A');
};

module.exports = Child;

<强> main.js

var Child = require('./child');
child = new Child();

child.A();
child.C();

正在运行main.js

$ node main.js
Child#A
Parent#C

源代码可以通过Git在以下Gist中进行克隆:https://gist.github.com/4704412


除此之外:澄清exports vs module.exports讨论:

如果要将新属性附加到导出对象,则可以使用exports。如果您想完全将导出重新分配给新值,您可以使用module.exports。例如:

// correct
exports.myFunc = function() { ... };
// also correct
module.exports.myFunc = function() { ... };

// not correct
exports = function() { ... };
// correct
module.exports = function() { ... };