How do I export an object with added prototype methods in node.js

[亡魂溺海] 提交于 2021-02-18 07:39:28

问题


I have an object in a file and want to be able to require that file and then create new instances of the object at whim, but I've hit a snag. This seems so incredibly basic, what am I missing.

hat.js

function Hat(owner) {
    this.owner = owner;
}
Hat.prototype.tip = function() {
    console.log("and he (" + owner + ") tipped his hat, just like this");
}
exports.Hat = Hat;

node terminal

Attempt 1

> require('./hat.js');
> var mighty_duck = new Hat('Emilio');
  ReferenceError: Hat is not defined

Attempt 2

> var Hat = require('./hat.js');
> var mighty_duck = new Hat('Emilio');
  { owner: 'Emilio' }
> mighty_duck.tip();
  TypeError: Object #<Hat> has no method 'tip'

Edit

I, most unfortunately, left out what turned out to be the biggest problem bit. The fact that I was trying to use

util.inherits(Hat, EventEmitter);

So my hat.js would actually be

function Hat(owner) {
    this.owner = owner;
}
Hat.prototype.tip = function() {
    console.log("and he (" + owner + ") tipped his hat, just like this");
}
util.inherits(Hat, EventEmitter);
exports.Hat = Hat;

This is an issue, because, apparently it is important to have your inherits call before you start extending the prototype. The fix is simple, move the inherits call up a few lines

function Hat(owner) {
    this.owner = owner;
}
util.inherits(Hat, EventEmitter);
Hat.prototype.tip = function() {
    console.log("and he (" + owner + ") tipped his hat, just like this");
}
exports.Hat = Hat;

回答1:


You are doing your require wrong:

var Hat = require('./hat.js').Hat;

Is what you want. When you do exports.Hat = Hat; you are exporting an object (exports) with a propery of Hat. So when you require './hat.js' you get the object, and need to access the Hat property.

From node repl:

> require('./hat.js');
{ Hat: [Function: Hat] }
> require('./hat.js').Hat;
[Function: Hat]
> var Hat = require('./hat.js').Hat;
undefined
> var mighty_duck = new Hat('Emilio');
undefined
> mighty_duck.tip();
and he (Emilio) tipped his hat, just like this

Of course that was causing an error since you said owner and not this.owner in tip(), but after I changed that it worked fine :)

If you want to just do

var Hat = require('./hat.js'),
    hat = new Hat('Emilio');

Then change your export to:

module.exports = exports = Hat;

And it works:

> require('./hat.js');
[Function: Hat]
> var Hat = require('./hat.js');
undefined
> var hat = new Hat('Emilio');
undefined
> hat.tip();
and he (Emilio) tipped his hat, just like this

EDIT Cleaned up and inherits from EventEmitter:

var util = require('util'),
    events = require('events');

var Hat = exports.Hat = function(owner) {
    events.EventEmitter.call(this);
    this.owner = owner;
}

util.inherits(Hat, events.EventEmitter);

Hat.prototype.tip = function() {
    console.log("and he (" + this.owner + ") tipped his hat, just like this");
}



回答2:


Have a look here: http://openmymind.net/2012/2/3/Node-Require-and-Exports/

you might try this instead:

function Hat(owner) {
    this.owner = owner;
}
Hat.prototype.tip = function() {
    console.log("and he (" + this.owner + ") tipped his hat, just like this");
}
module.exports = Hat;

and then sth. like this:

var hat = require('./hat.js');
var mighty_duck = new hat('Emilio');
mighty_duck.tip()


来源:https://stackoverflow.com/questions/13364703/how-do-i-export-an-object-with-added-prototype-methods-in-node-js

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!