2010-10-20 2 views
1

Я недавно попадал в OOP javascript и все больше и больше слышал о закрытии. После дня извращения моего мозга я теперь понимаю их *, но я до сих пор не вижу преимущества над использованием объекта. Кажется, что они делают то же самое, но я подозреваю, что что-то не хватает.Есть ли практическая причина, почему я выбрал бы закрытие объекта?

* я думаю

Редактировать

Я только что потратил 20 минут, пытаясь написать пример использования счетчика записывается в виде объекта и счетчик записывается в виде закрытия. Я пришел к выводу, что я до сих пор не понимаю закрытия.

вторых Редактировать

Хорошо, я сумел кнут в чрезвычайно простого примера. Между этими двумя не так много, но я считаю, что версия объекта более читаема. Почему я выбрал один за другим?

 

/*** Closure way ***/ 

function closureCounter() { 
    var count = 0; 
    return { 
     increase : function() { 
      count++; 
      alert(count); 
     }, 
     decrease : function() { 
      count--; 
      alert(count); 
     } 
    }; 
} 

var myCounter = closureCounter(); 

myCounter.increase(); 
myCounter.decrease(); 


/*** Object way ***/ 

function objCounter() { 
    var count = 0; 
    this.increase = function() { 
     count++; 
     alert(count); 
    } 
    this.decrease = function() { 
     count--; 
     alert(count); 
    } 

} 

var myCounter = new objCounter(); 

myCounter.increase(); 
myCounter.decrease(); 




 
+0

Я не уверен, что я Понимаю. Можете ли вы привести пример двух вещей, которые вы сравниваете? Я представляю что-то вроде 'function (x) {...}' versus возможно '{f: function (x) {...}}', но я не уверен. – Ken

+1

Затворы и объекты - это разные понятия и могут использоваться одновременно. Что вы подразумеваете, используя закрытие объектов? Можете ли вы привести пример, пожалуйста? –

+1

Среда, в которой функция закрывается, не отличается от метода, который имеет доступ к внутреннему состоянию объекта. Я скорее рассматриваю это как другой способ выражения той же концепции. –

ответ

3

Вы не должны рисковать дополнительные ошибки и путаницу, создав совершенно новый объект, когда закрытие будет делать то же самое с более чистым и простым кодом. С закрытием гораздо проще связать объекты.

пример:

function attachOnclick(eSource, eParent) { 
    var e = document.createElement("div"); 
    eParent.appendChild(e); 
    eSource.onclick = function() { e.style.backgroundColor = "881010"; } 
} 

против

var elemLinks = []; 
function attachOnclick2(eSource, eParent) { 
    var e = document.createElement("div"); 
    eParent.appendChild(e); 
    elemLinks.push({elemSrc: eSource, elemDest: e}); // Append to mappings list 
    eSource.onclick = changeColor; 
} 

function changeColor() { 
    for(var i = elemLinks.length; i--;) { 
     if(this == elemLinks[i].elemSrc) { // We've found our match 
      elemLinks[i].elemDest.style.backgroundColor = "881010"; 
      return true; 
     } 
    } 

    return false; 
} 

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

+2

+1 для отказа от ответственности в конце = P –

3

Как сказал мастерik, вы сравниваете яблоки и апельсины.

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

http://robertnyman.com/2008/10/09/explaining-javascript-scope-and-closures/

Разница между вашими двумя примерами создания объектов связано с различными формами написания классов/объектов в JS. Первый пример, который, я считаю, называется шаблоном модуля? Второй пример - еще один распространенный способ определения классов в JS, или вы также можете использовать прототип объекта для добавления этих методов.

Для получения дополнительной информации о том, как писать классы, попробуйте прибегая к помощи «моделям JS класса» (есть немало ресурсов, с различными узорами - модулем, модулем выявления, одноэлементные и т.д.)

+0

Спасибо, теперь это имеет больше смысла. Эта статья, с которой вы связаны, действительно помогла. – MrMisterMan

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