4

ファイルにオブジェクトがあり、そのファイルを要求して、気まぐれにオブジェクトの新しいインスタンスを作成できるようにしたいのですが、問題が発生しました。これは信じられないほど基本的なようですが、何が欠けていますか。

帽子.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;

ノード端末

試行 1

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

試行 2

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

編集

私は、最も残念なことに、最大の問題であることが判明したものを省略しました。使おうとしていたという事実

util.inherits(Hat, EventEmitter);

したがって、私のhat.jsは実際には

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;

プロトタイプの拡張を開始する前に呼び出しを行うことが重要であるため、これは問題です。修正は簡単です。呼び出しを数行上に移動しますinheritsinherits

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;
4

2 に答える 2

4

こちらをご覧ください: http://openmymind.net/2012/2/3/Node-Require-and-Exports/

代わりにこれを試すことができます:

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;

そしてsth。このような:

var hat = require('./hat.js');
var mighty_duck = new hat('Emilio');
mighty_duck.tip()
于 2012-11-13T16:40:51.860 に答える
2

あなたはあなたの要求を間違ってやっています:

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

あなたが望むものです。これを行うexports.Hat = Hat;ときは、プロパティが。のオブジェクト(exports)をエクスポートしますHat。したがって、必要な'./hat.js'場合はオブジェクトを取得し、プロパティにアクセスする必要がありHatます。

ノード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

もちろん、あなたが言ったので、それはエラーを引き起こしてownerthis.ownerましtip()たが、私が変更した後、それはうまくいきました:)

やりたいだけなら

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

次に、エクスポートを次のように変更します。

module.exports = exports = Hat;

そしてそれは機能します:

> 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

編集クリーンアップされ、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");
}
于 2012-11-13T16:35:34.713 に答える