为什么不用在NodeJS中创建对象就可以在类定义内调用函数?

时间:2019-01-17 19:13:10

标签: javascript node.js oop

例如:

var fs = require('fs');
var currDir = fs.readdirSync('./lib');
console.log(currDir);

此代码可以正常工作。但是我不明白,当未创建fs类的对象时,如何调用fs.readdirSync()函数。

var fsClass = require('fs');
var fs = new fsClass();
var currDir = fs.readdirSync('./lib');
console.log(currDir);

但是,当我尝试创建一个对象并在该实例上调用该函数时,代码不起作用。错误消息:

TypeError: fsClass is not a constructor
    at Object.<anonymous>

谢谢!

3 个答案:

答案 0 :(得分:1)

fs对象已使用以下方法创建:

var fs = require('fs');

fs模块导出已创建的对象。 fs不是构造函数或类。这是一个已经创建的对象,您可以直接调用其方法。

一个模块可以导出许多东西。它可以导出一个已经创建并具有方法的对象。它可以导出一个构造函数,该函数将调用该函数来创建一个对象。它可以只导出一个值。在这种特殊情况下,fs模块将导出一个已经创建的模块,您可以直接在其上调用方法。无需执行单独的构造函数来创建另一个对象。

答案 1 :(得分:0)

fs不是类,而是对象。 该对象已导出,因此当您require时,所有定义的功能都可用。

看一下代码: https://github.com/nodejs/node/blob/1375af204a30d1885b9e8bf79725cbd223707439/lib/fs.js#L1796

它们导出一个带有功能的对象。

现在假设您创建一个类,而不仅仅是一个常规对象(即{}),您可以将其导出为类或对象

module.exports = SomeClass 

modules.exports = new SomeClass();

答案 2 :(得分:-1)

您需要停止思考Java,C#和相关语言附带的经典继承模型。 在JavaScript中没有像这样的语言的“类” ;而是使用mechanism based on prototypes。即使ES2015将“类”的概念引入JavaScript中,它也只是构造函数的语法糖。

因此,尊重您的问题:

  

并非所有内容都必须由JavaScript中的类组成

还有object之类的其他结构和类型,正是GL_TEXTURE_2D模块的类型。它们只是存储数据的键/值结构。