2013-03-06 5 views
1

Я создаю приложение Node.js. У меня есть проект с этой структурой:Javascript, поведение instanceof function

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

файловсписок plc.js, scheduler.js и source.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.js (var mod_plc = require('../plc/plc.js'); или var mod_plc = require('./plc.js'); для планировщика), но только в тесте .js он работает правильно, Infact, если я пишу

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) 

А «временное решение» может быть

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

, но я не думаю, что это реальное решение, так как со всеми другими объектами (я более чем 20 файлов написаны как plc.js) эта проблема не существует.

Любое предложение? Вам нужна дополнительная информация? Благодаря

+0

Возможный дубликат [Что означает этот экземпляр сообщения об ошибке?] (Http://stackoverflow.com/questions/6021245/what-does-this-instanceof-error-message-mean) – jbabey

+0

Что делает декларация экспорта из Как выглядит plc.js? – pgreen2

+0

Учитывая, что 'TypeError' сообщает вам, что' mod_plc' является 'Object' (а не функцией конструктора) и что он работает с' mod_plc.constructor', я бы сказал, что модуль (например, 'scheduler.js') экспортирует новый экземпляр 'plc', а не сама функция. – c24w

ответ

0

Суммируя мои комментарии из выше:

Учитывая, что:

  • TypeError говорит вам mod_plc является Object (не конструктор функции); и
  • с использованием mod_plc.constructor дает ожидаемое поведение;

это выглядит как ваша PLC переменная где был назначен экземпляр mod_plc (следовательно, больше не является ссылка на ожидаемой функции конструктора).

Смежные вопросы