2013-03-06 55 views
1

我正在創建一個Node.js應用程序。我有這個結構的項目:Javascript,instanceof函數的行爲

[Project Folder] 
    | 
    |---[plc] 
    |  |--- plc.js 
    |  |--- scheduler.js 
    | 
    |---[source] 
    |  |--- source.js 
    | 
    |---[test] 
     |--- test.js 

的文件plc.jsscheduler.jssource.js是「物」,它們需要其他對象,並在文件末尾,有一個「導出」的對象。 特別是文件plc.js有一個奇怪的行爲。首先代碼:

var mod_pollist  = require('./polling_list.js');  // Polling list. 
var mod_operation = require('./operation.js');  // Single operation. 
var mod_scheduler = require('./scheduler.js');  // Scheduler object. 
var mod_events  = require('events');   // Event emitter 
var mod_util  = require('../util.js');  // Util functions 

function plc(comm_driver){ 
    var self = this; 
    // Other variables are set here 
} 

// Other functions written as plc.prototype.something = function(parameters){...} 

module.exports = plc; 

現在怪異的行爲:所有其他文件必須在文件的頂部只有在測試導入plc.jsvar mod_plc = require('../plc/plc.js');var mod_plc = require('./plc.js');調度程序),但代碼.js文件它工作正常,事實上如果我寫

if(PLC instanceof mod_plc) 
    console.log('yes'); 
文件中

test.js我能找到一個「是」在控制檯上,如果我在其他文件中寫相同的代碼,我獲得錯誤:

if(PLC instanceof mod_plc) 
       ^
TypeError: Expecting a function in instanceof check, but got #<Object> 
    at Object.<anonymous> (C:\Users\Massimo\workspace\Scada\plc\scheduler.js:16: 
19) 

A「治標不治本」可能是

if(PLC instanceof mod_plc.constructor) 
    console.log('yes'); 

,但我不認爲是真正的解決方案,因爲與所有其他對象(我已經寫了像plc.js超過20個文件)這個問題不存在。

有什麼建議嗎?你需要更多的信息嗎? 感謝

+0

可能的重複[此實例的錯誤消息是什麼意思?](http://stackoverflow.com/questions/6021245/what-does-this-instanceof-error-message-mean) – jbabey 2013-03-06 15:16:53

+0

什麼是出口聲明從plc.js看起來像? – pgreen2 2013-03-06 15:17:25

+0

鑑於'TypeError'告訴你'mod_plc'是一個'Object'(而不是一個構造函數)並且它可以和'mod_plc.constructor'一起工作,我會說這個模塊(比如'scheduler.js')正在導出'plc'的新實例,而不是函數本身。 – c24w 2013-03-06 15:26:39

回答

0

從以上總結一下我的意見:

鑑於:

  • TypeError告訴你mod_plcObject(不是構造函數);和
  • 使用mod_plc.constructor會給你預期的行爲;

它看起來像你的PLC變量某處被分配的mod_plc實例(因此不再是預期的構造函數的引用)。