Статьи

Один шаблон проектирования JavaScript, без которого я не могу жить

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

Позвольте мне показать вам обзор, а затем посмотреть, как все это получается:

function MyScript(){} (function() { var THIS = this; function defined(x) { return typeof x != 'undefined'; } this.ready = false; this.init = function() { this.ready = true; }; this.doSomething = function() { }; var options = { x : 123, y : 'abc' }; this.define = function(key, value) { if(defined(options[key])) { options[key] = value; } }; }).apply(MyScript);

Как видно из этого примера кода, общая структура является функциональным литералом:

 (function() { ... })();[/xml]
A function literal is essentially a self-executing scope, equivalent to defining a named function and then calling it immediately:
[xml]function doSomething() { ... } doSomething();

Изначально я начал использовать функциональные литералы для инкапсуляции — любой сценарий любого формата можно обернуть в это приложение, и он эффективно «запечатывает» его в частную область, предотвращая конфликт с другими сценариями в той же области или с данные в глобальном масштабе. Пара скобок в самом конце — это то, что выполняет область, вызывая ее, как и любую другую функцию.

Но если вместо того, чтобы просто вызывать его глобально, область видимости выполняется с помощью Function.apply , она может быть выполнена для выполнения в определенной именованной области действия, на которую затем можно ссылаться извне.

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

Красота внутри

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

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

Но в то же время, что и совместное использование общедоступных данных, каждый из них может определять и свои личные данные . Вот, например, в самом верху скрипта:

 var THIS = this;

Мы создали закрытую переменную с именем THIS"self = this"

Другие частные переменные, объявленные таким же образом, могут использовать соглашение в верхнем регистре, если они определяют постоянные данные (однако следует избегать объявления с использованием constvar

Частные функции могут использоваться для обеспечения внутренних утилит:

 function defined(x) { return typeof x != 'undefined'; }

Затем мы можем создать открытые методы и свойства, доступные для других экземпляров и извне:

 this.ready = false; this.init = function() { this.ready = true; }; this.doSomething = function() { };

Мы также можем создавать привилегированные значения, которые являются частными, но общедоступными, в этом случае с помощью метода public define его аргументы могут быть дополнительно проверены в соответствии с потребностями данных:

 var options = { x : 123, y : 'abc' }; this.define = function(key, value) { if(defined(options[key])) { options[key] = value; } };

Завернутый!

Все эти особенности делают конструкцию такой полезной для меня. И все это заключено в аккуратный, самовыполняющийся синглтон — одноразовый объект, который легко ссылаться и интегрировать, и который прост в использовании!

Так что ты думаешь? Вам знаком этот паттерн или у вас есть что-то еще, что вы хотели бы использовать?

Миниатюра кредит: суперкимбо