Вопрос

Я создаю библиотеку (https://github.com/OscarGodson/storageLocker), точнее оболочку localStorage, но поскольку это моя первая попытка в OO JavaScript, я все еще учусь, и у меня есть пара вопросов.

  1. Я видел в других библиотеках, что иногда они оборачивают их в анонимную функцию.Должен ли я сделать это с этим?И если да, то как, ничего не сломав?

  2. Для внутреннего API (в основном, внутренних функций), как я должен их написать?Следует добавить их к основному объекту, например storageLocker.prototype.myInternalFunction() или просто myInternalFunction() случайно в моем сценарии?Однако я не хотел, чтобы функции были глобальными...Одна из функций, например, просто проверяет кучу элементов в JSON, проверяет, являются ли их объекты, а затем проверяет, каков тип объекта (например Date()), а затем преобразует его.

  3. Как / где я должен добавить глобальные переменные в свой скрипт?например ,у меня есть 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/

есть приличный раздел о пространстве имен, который стоит прочитать.

http://yuiblog.com/blog/2007/06/12/module-pattern/

это также еще один хороший обзор.

Для получения более подробного материала о хороших методах работы с javascript ознакомьтесь с

http://javascript.crockford.com/

После нашего обсуждения в комментариях я изменил пример на этот:

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"

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top