2016-12-31 1 views
3

У меня есть некоторые вопросы о том, как вы можете создавать модули в JavaScript. Это синтаксис я нашел:Javascript Модули и шаблоны проектирования

var Westeros; 
(function (Westeros) { 
    (function (Structures) { 
     var Castle = (function() { 
      function Castle(name) { 
       this.name = name; 
      } 
      Castle.prototype.build = function() { 
       console.log("Castle " + this.name) 
      }; 
      return Castle; 
     })(); 
     Structures.Castle = Castle; 
    })(Westeros.Structures || (Westeros.Structures = {})); 
    var Structures = Westeros.Structures; 
})(Westeros || (Westeros = {})); 

var winterfell = new Westeros.Structures.Castle("Winterfell"); 
winterfell.build(); 

Я взял this code from Mastering Javascript Design Patterns. Однако я попытался найти ответ, почему нужна эта строка:

var Structures = Westeros.Structures; 

Если вы пропустили эту строку, код работает должным образом. Есть ли объяснения для этого? Может быть, «раскрыть» класс?

Спасибо!

+7

Черт, это отвратительный код. Есть книга, которая говорит вам об этом? –

+0

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

+0

Определенно трудно читать ... – Legends

ответ

1

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

function Castle(name) { 
    this.name = name; 
} 

Castle.prototype.build = function() { 
    console.log("Castle " + this.name) 
}; 

var Westeros = { 
    Structures: {} 
}; 

Westeros.Structures.Castle = Castle; 

var winterfell = new Westeros.Structures.Castle("Winterfell"); 
winterfell.build(); 

При определении «класса» в ES5, все, что вам нужно сделать, это объявить функцию с некоторыми аргументами и местом любых код инициализации вы хотите внутри. Способы добавляются к свойству .prototype этой функции, а новые объекты, использующие этот класс, создаются путем вызова его функции-конструктора с помощью ключевого слова new.

Что касается var Structures = Westeros.Structures;, это нецелесообразно. Если бы вы сохранили образец исходного кода, удаление его ничего не изменило бы. Фактически, он не может использоваться даже при большем количестве кода, потому что он объявлен в закрытии и не может быть доступен за пределами этой области.

+0

Как насчет того, хотите ли вы имитировать пространства имен? Довольно простое решение было бы просто создать глобальный объект, а затем начать добавлять объекты внутри него, не так ли? – sms343

+0

Это правильно. Если вы поместите этот код в глобальную область видимости, «Westeros» будет глобальной переменной, и, таким образом, «Замок» можно получить в любом месте через пространство имен «Westeros» ». Вы также можете взглянуть на то, соответствует ли [RequireJS] (http://requirejs.org/) вашим потребностям. – Hydrothermal

+0

Удивительная благодарность! Итак, в ванильном javascript я видел из разных источников создание этого типа модулей (function() {})(). Я полагаю, что с другими решениями вы можете реализовать шаблоны проектирования аналогичным образом. – sms343