Создаю свою библиотеку JS, пара вопросов
-
29-09-2019 - |
Вопрос
Я создаю библиотеку (https://github.com/OscarGodson/storageLocker), точнее оболочку localStorage, но поскольку это моя первая попытка в OO JavaScript, я все еще учусь, и у меня есть пара вопросов.
Я видел в других библиотеках, что иногда они оборачивают их в анонимную функцию.Должен ли я сделать это с этим?И если да, то как, ничего не сломав?
Для внутреннего API (в основном, внутренних функций), как я должен их написать?Следует добавить их к основному объекту, например
storageLocker.prototype.myInternalFunction()
или простоmyInternalFunction()
случайно в моем сценарии?Однако я не хотел, чтобы функции были глобальными...Одна из функций, например, просто проверяет кучу элементов в JSON, проверяет, являются ли их объекты, а затем проверяет, каков тип объекта (напримерDate()
), а затем преобразует его.Как / где я должен добавить глобальные переменные в свой скрипт?например ,у меня есть var под названием
patterns
это что-то вродеvar patterns = {"date":/\/Date\(([0-9]+)\)\//}
как я должен добавить это в свой скрипт?
Большое спасибо.Я хочу написать свой сценарий следующим образом: правильный путь поэтому я спрашиваю вас, ребята.Я не знаю ни одного местного специалиста по JS, который занимался бы каким-либо OO JS, все они олдскульные типы...
Решение
http://nefariousdesigns.co.uk/archive/2010/10/object-oriented-javascript-follow-up-part-2-technical/
есть приличный раздел о пространстве имен, который стоит прочитать.
это также еще один хороший обзор.
Для получения более подробного материала о хороших методах работы с javascript ознакомьтесь с
После нашего обсуждения в комментариях я изменил пример на этот:
var storageLocker = function (selector) {
var _selector = selector || "default value";
function myPrivateFunction() {
}
var public = {
get: function () {
return _selector;
},
uppercase : function () {
_selector = _selector.toUpperCase()
return this;
}
}
return public;
};
// use:
var test = storageLocker("search for this").uppercase().get();;
alert(test);
Хотя это не совсем пример библиотеки / модуля (потому что вы обращаетесь к коду, вызывая конструктор напрямую), это пример сохранения одного и того же объекта в области видимости для дальнейшего объединения методов в цепочку.На самом деле это не возвращает storageLocker
объект, он возвращает "общедоступный" объект, но этот объект имеет доступ к storageLocker
сфера охвата через закрытие.
Могли бы быть и другие лучшие способы сделать это, возможно, вернув storageLocker
сам объект, но это потребовало бы немного большего обдумывания.
Другие советы
Я бы сказал:
1) цель этого метода - не загрязнять глобальное пространство имен.Это хорошая вещь.В приведенном ниже примере вы можете видеть, что все ваше взаимодействие с библиотекой осуществляется через один объект MyLibrary.Публичный API - это возвращаемое значение анонимной функции.
var MyLibrary = function() {
// private
this.InternalVariable = 'some value';
function internalFunction(x,y) {
return x + y;
}
function getInternalVariable() {
return this.InternalVariable;
}
// public
return {
publicVariable : '1.0',
publicFunction : function(x,y) {
return x + y
},
accessInternalVariable : function() {
return getInternalVariable();
}
}
}();
2) смотрите также приведенный выше пример о том, как разместить ваши "внутренние" функции
3) если ваша глобальная переменная является каким-то параметром конфигурации, я бы просто сделал public setter / getter и сохранил переменную "private"