【问题标题】:Javascript, behavior of instanceof functionJavascript,instanceof 函数的行为
【发布时间】:2013-03-06 15:14:22
【问题描述】:

我正在创建一个 Node.js 应用程序。我有一个具有这种结构的项目:

[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.js 的代码(var mod_plc = require('../plc/plc.js');var mod_plc = require('./plc.js'); 用于调度程序)但仅在 test.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)

“临时解决方案”可能是

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

但我认为这不是真正的解决方案,因为对于所有其他对象(我有 20 多个类似 plc.js 的文件),这个问题不存在。

有什么建议吗?您需要更多信息吗? 谢谢

【问题讨论】:

  • plc.js 的出口声明是什么样的?
  • 鉴于TypeError 告诉您mod_plcObject(而不是构造函数)并且它与mod_plc.constructor 一起使用,我会说模块(例如@ 987654333@) 正在导出 plc 的新实例,而不是函数本身。
  • @jbabey 它不是重复的,因为“instanceof”与项目中的所有其他对象都能很好地配合使用。该解决方案有效,但我认为它不能真正解决我的问题。
  • 或者更好:在回复中写下您的想法,以便我可以选择它作为最佳答案,并在评论中解释解决方案...这样您可以获得应得的声誉:)

标签: javascript node.js instanceof


【解决方案1】:

从上面总结我的cmets:

鉴于:

  • TypeError 告诉你mod_plcObject(不是构造函数);和
  • 使用mod_plc.constructor 可以得到预期的行为;

您的 PLC 变量似乎在某处被分配了一个 mod_plc 的实例(因此不再是对预期构造函数的引用)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-17
    • 2013-03-19
    • 1970-01-01
    • 2015-02-22
    • 2023-04-06
    相关资源
    最近更新 更多