Для создания библиотеки JS я внутренне создаю объекты, используя шаблон конструктора. Теперь каждый тип объекта находится в своем собственном файле, так что книга находится в book.js. Все файлы объединяются, а затем минимизируются.

book.js
--------

function Book (data) {
  this.data = data;
}

Book.prototype.rent = function(name) {
  console.log("Rent the book to " + name);
}

Теперь, когда страница с библиотекой загружена, я могу заметить, что из консоли браузера можно напрямую создавать объекты книги.

var b = new Book("somedata");

Я вижу 2 вопроса здесь

  1. загрязнение глобального пространства имен, так как объект Book () не виден в глобальной области видимости.
  2. Проблема безопасности, так как любой может создавать объекты без пространства имен из консоли.

Библиотека на самом деле находится в пространстве имен с использованием раскрывающегося шаблона модуля. Есть ли в любом случае проблемы, которые я упомянул выше, можно безопасно решить? Во всяком случае, чтобы скрыть объекты из глобального пространства имен (консоли)?

1
sthustfo 15 Дек 2015 в 14:19

3 ответа

Лучший ответ

Проблема безопасности, так как любой может создавать объекты без пространства имен из консоли.

Это не проблема, любой может создавать объекты в вашем пространстве имен и из консоли.

загрязнение глобального пространства имен, поскольку объект Book() теперь виден в глобальной области видимости. Библиотека на самом деле находится в пространстве имен с использованием раскрывающегося шаблона модуля.

Если вы загружаете все эти файлы как сценарии, они помещают объявленные в них классы в глобальное пространство имен. Как-то неизбежно использовать глобальное пространство имен, но вы можете сразу же поместить все свои объекты в это пространство имен пользовательской библиотеки, используя шаблон раскрывающегося модуля. Вам нужно будет обернуть каждый из этих файлов в IEFE, который присоединяет соответствующий класс к City.Library:

City.Library.Book = (function() {
    function Book (data) {
        this.data = data;
    }
    Book.prototype.rent = function(name) {
        console.log("Rent the book to " + name);
    };
    return Book;
}());

Кроме того, рассматривайте файлы как модули (предпочтительнее ES6) и позвольте загрузчику / сборщику модулей выполнить эту работу автоматически.

1
Bergi 16 Дек 2015 в 06:24

Вы можете обернуть их в замыкания, чтобы сохранить их от глобальных, но есть фундаментальная проблема с этим - вы хотите, чтобы ваши функции / конструкторы / whatevers были доступны!

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

Следует также отметить, что существуют и другие решения для написания модульного кода, такие как веб-пакет или jspm

0
Matt Styles 15 Дек 2015 в 11:25

Вы можете использовать модуль require на стороне сервера и создать задачу grunt для запуска задачи browserify в файле точки входа, чтобы весь ваш код был преобразован в один файл и не был доступен из глобального пространства имен. проверьте http://browserify.org для получения дополнительной информации.

2
Jignesh Thummar 15 Дек 2015 в 11:38