Импорт расширения прототипа JavaScript

#javascript #javascript-import

#javascript #javascript-импорт

Вопрос:

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

файл: SomeLib.js

 "use strict";
Number.prototype.round = function(places) {
    return  (Math.round(this   "e "   places)    "e-"   places);
}
function foo() {
    console.log("doing SomeLib.foo()");
}
export default { round, foo }
  

файл: SomeImporter.js

 "use strict";
import somelib from "./SomeLib.js"; 
somelib.foo();   // outputs 'doing SomeLib.foo()'
var someNum = 1.2345;
console.log(someNum.round(2)); // outputs 'Uncaught ReferenceError: round is not defined'
  

Как я могу импортировать функцию ‘Number.prototype.round’ в другой файл?

Комментарии:

1. import 'whatever'; это способ импортировать модуль только для побочных эффектов.

2. Я пытаюсь разделить функцию round(), чтобы я мог легко ссылаться на нее и использовать ее в других файлах без необходимости добавлять ее в начало каждого файла. Вы хотите сказать, что мой метод импорта запрещает это? Я делаю это неправильно?

3. Импорт этого файла в любом месте страницы изменяет глобальный номер.prototype . Он будет работать во всех ваших файлах, выполненных после этого. При этом это ужасная идея и никогда не изменяйте прототипы, которые вы не создавали .

4. Обратите внимание, что этот round метод на самом деле сломан и не работает для очень маленьких или очень больших чисел. Не используйте его.

5. Приятно знать, что он прерывается и возвращает ‘NaN’. Спасибо @Bergi

Ответ №1:

Не уверен, почему someNum.round() выдает ошибку, даже если раунд уже определен в прототипе Number в импортированном файле. (Число.prototype.round в someLib.js )

Теперь, поскольку вы вернули round, который нигде не определен в someLib.js На самом деле вы можете передать ссылку на Number.prototype.round, как показано ниже.

 export default { round: Number.prototype.round, foo }
  

Затем либо вы используете его непосредственно как

 SomeLib.round.call(someNum, 2)
  

Или вы можете установить прототип Number в этом файле.

Хотя не уверен, почему уже определенный прототип номера не работал.

Комментарии:

1. Определение экспорта, как вы делали выше, позволяет someNum.round(2) работать. Спасибо.