2013-11-13 3 views
0

Просто просмотрите код и скажите, что это за подход Javascript?Какой шаблон дизайна/подхода Javascript это?

var Arithmetic = function(){ 
    var obj = { 
    add: function(a,b) { return a + b; }, 
    multiply: function(a,b) { return a * b; } 
    }; 
    return obj; 
}(); 

var resultAdd = Arithmetic.add(a,b); 
var resultMul = Arithmetic.multiply(a,b); 

Почему люди пишут код js таким образом ... любое преимущество для написания такого способа.

Вышеупомянутый код относится к любому шаблону проектирования? Если да, то скажите мне имя.

Я всегда пишу код таким образом, и это легко понять.

function add(a,b) 
{ 
return a+b; 
} 

function multiply(a,b) 
{ 
return a*b; 
} 

и я просто назвать это как таким образом

var x=add(2,3); 
var y=multiply(5,8); 

также сказать мне, что является недостатком написания кода мой путь.

+0

Проверьте это: http://addyosmani.com/resources/essentialjsdesignpatterns/book/ – jtromans

+0

Какую часть вы спрашиваете о? Есть методы объекта типа 'Arithmetic.add()' вместо 'add()'? Или имеет выражение функции, которое немедленно выполняется с результатом, назначенным переменной, такой как var var. Или все, что выше? – nnnnnn

+0

почему отрицательная маркировка? – Thomas

ответ

2

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

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

Если вы анализируете код немного, то var obj определяется не в глобальной области видимости, а в области анонимной функции, поэтому код вне его может использовать имя obj для переменной без столкновения. Функциональность (два метода) экспортируется в общедоступное использование, возвращая объект с двумя свойствами из анонимной функции. Поскольку нет необходимости в более чем одном экземпляре этих двух методов, анонимная функция немедленно возвращается (http://en.wikipedia.org/wiki/Immediately-invoked_function_expression).

Еще одно преимущество этой модели является то, что она позволяет иметь приватные переменные:

var uniqueId = function() { 
    var id = 0; 
    return function() { return id++; } 
}(); 

uniqueId(); // 0 
uniqueId(); // 1 

В приведенном выше примере нет никакого способа, чтобы случайно не повредить функцию UniqueID давать плохие (без уникальных) результатов, потому что вы выставляете только функциональный интерфейс, который вы хотите, а не весь механизм.

Рассмотрим эквивалент в вашем стиле:

var id = 0; 
function uniqueId() { return id++; }; 

uniqueId(); // 0 
id = 0; 
uniqueId(); // 0 
+0

В примере, предоставленном OP, есть ли какое-то преимущество в создании объекта внутри этого закрытия, а не просто его записи буквально? Конечно, я вижу вашу точку в ВАШЕМ примере, но в «Арифметике» нет частных членов ... –

+0

@JohannesH. Нет, функционально это то же самое, что «var Arithmetic = {add: function() {/*...*/}, multiply: function() {/*...*/}}'. Однако, если код должен измениться и некоторые части пакета арифметики, которые не являются общедоступными, необходимо будет использовать IIFE, чтобы сохранить конфиденциальность. – Tibos

+0

Согласен на это;) –

-2

Код, который вы нам предоставили, представляет собой расширенный пример объектно-ориентированного кода. Я действительно не вижу преимущества этого encapuslated obj прямо сейчас, что просто затрудняет чтение. В основном Arithmetic действует как статический класс. Без этого инкапсулированных obj и прямоприменяемую функцию, она может быть записана так:

var Arithmetic = { 
    add:  function(a,b) { return a + b; }, 
    multiply: function(a,b) { return a * b; } 
} 

код, который вы дали нам на самом деле делают то же самое - он просто не записать этот объект непосредственно, но создают его с помощью этого self-executing function (то есть замыкание, «функция без имени», которая называется (путем добавления к ней ()) сразу после ее создания).

Достоинством OO-кода на самом деле нелегко сбить несколько строк, но относительно статических классов как набора методов (как это делается здесь): это encapusulation.You может обрабатывать каждый созданный объект/объект как черный ящик и не нужно беспокоиться о деталях (как только это работает, конечно).

disadvantqage вашей «традиционный» подход: он получить-х corweded как только вы получили много, много функций, и вы не можете легко сказать, какой «группе» они принадлежат, если не включать THST в соглашениях об именовании ваших (как math_add() или math_mul())

+0

_... каждый раз, когда вы вызываете Arithmetic_? Это не функция, не класс. Это простой объект. –

+0

@amadeus: Я пропустил '()' в конце объявления 'Arithmetic'. Исправлено это уже - вы можете удалить ваш downvote;) –

+0

H: Образец IIFE не является объектно-ориентированным шаблоном вообще. –

Смежные вопросы