Почему можно вызывать функцию внутри определения класса, не создавая ее объект в NodeJS? - PullRequest
0 голосов
/ 17 января 2019

Например:

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

Этот код работает правильно, как и ожидалось. Но я не могу понять, как можно вызывать функцию fs.readdirSync (), если объект класса fs не был создан.

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 голосов
/ 17 января 2019

fs это не класс, а Объект. Этот объект был экспортирован, поэтому при require все определенные функции становятся доступными.

Посмотрите на код: https://github.com/nodejs/node/blob/1375af204a30d1885b9e8bf79725cbd223707439/lib/fs.js#L1796

Они экспортируют объект с функциями внутри него.

Теперь предположим, что вы создаете класс, а не просто обычный объект (например, {}), вы можете экспортировать его как класс или объект

module.exports = SomeClass 

или

modules.exports = new SomeClass();
0 голосов
/ 17 января 2019

Вам нужно перестать думать в классической модели наследования, которая поставляется с Java, C # и родственными языками. В JavaScript нет «классов», подобных этим языкам ; вместо этого он использует механизм на основе прототипов . Даже когда ES2015 переносит понятие «класс» в JavaScript, это всего лишь синтаксический сахар для функций конструктора.

Итак, уважение к вашему вопросу:

Не все обязательно состоят из классов в JavaScript

Существуют и другие структуры и типы, такие как object, которые в точности соответствуют типу fs. Это просто структуры ключ / значение для хранения данных.

0 голосов
/ 17 января 2019

Объект fs уже создан с:

var fs = require('fs');

Модуль fs экспортирует объект, который уже создан. fs не является конструктором или классом. Это уже созданный объект, для которого вы можете напрямую вызывать его методы.

Модуль может экспортировать любое количество вещей. Он может экспортировать объект, который уже создан и на котором уже есть методы. Он может экспортировать функцию конструктора, которую можно было бы вызвать для создания объекта. Он может экспортировать только значение. В этом конкретном случае модуль fs экспортирует уже созданный модуль, для которого вы можете просто вызвать методы напрямую. Нет необходимости выполнять отдельный конструктор для создания другого объекта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...