2015-04-09 5 views
0

Я читал Closures и у него есть пример следующего закрытия.Javascript Closure vs Javascript OO

var makeCounter = function() { 
var privateCounter = 0; 
    function changeBy(val) 
    { 
     privateCounter += val; 
    } 
    return 
    { 
     increment: function() 
    { 
     changeBy(1); 
    }, 
    decrement: function() 
    { 
     changeBy(-1); 
    }, 
    value: function() 
    { 
     return privateCounter; 
    } 
    } 
}; 

var counter1 = makeCounter(); 
var counter2 = makeCounter(); 
alert(counter1.value()); /* Alerts 0 */ 
counter1.increment(); 
counter1.increment(); 
alert(counter1.value()); /* Alerts 2 */ 
counter1.decrement(); 
alert(counter1.value()); /* Alerts 1 */ 
alert(counter2.value()); /* Alerts 0 */ 

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

var makeCounter = function() { 
var privateCounter = 0; 
    function changeBy(val) 
     { 
     privateCounter += val; 
     }; 
    this.increment= function() 
    { 
     changeBy(1); 
    }; 
    this.decrement= function() 
    { 
     changeBy(-1); 
    }; 
    this.value= function() 
    { 
     return privateCounter; 
    }; 
    }; 

var counter1 = new makeCounter(); 
var counter2 = new makeCounter(); 
alert(counter1.value()); /* Alerts 0 */ 
counter1.increment(); 
counter1.increment(); 
alert(counter1.value()); /* Alerts 2 */ 
counter1.decrement(); 
alert(counter1.value()); /* Alerts 1 */ 
alert(counter2.value()); /* Alerts 0 */ 
+0

Выберите свой код, нажмите кнопку '{}' в панели инструментов на ** отступом на 4 пробела **. Вот как вы отмечаете код как код здесь. Прочитайте остальную часть справки по редактированию, пока вы на ней. Это сделало бы это для вас, но я не собираюсь убирать все эти
. – deceze

ответ

1

Ваша вторая версия делает использование закрытия, а также, вряд ли есть разница в этом отношении.

Важным отличием является то, что ваш первый makeCounter является завод, который возвращает объект буквального (который наследуется от Object.prototype), в то время как ваша вторая makeCounter функция конструктора (должна быть вызвана с new), что делает возвращать экземпляр который наследуется от makeCounter.prototype. Вы можете gain some advantages, перемещая методы на прототипе:

function Counter() { 
    var privateCounter = 0; 
    this.changeBy = function changeBy(val) { 
     privateCounter += val; 
    }; 
    this.value = function() { 
     return privateCounter; 
    }; 
} 
Counter.prototype.increment = function() { 
    this.changeBy(1); 
}; 
Counter.prototype.decrement = function() { 
    this.changeBy(-1); 
}; 

Вы могли бы избежать закрытия (привилегированные методы) и использовать методы прототипа только:

function Counter() { 
    this.counter = 0; // no more private 
} 
Counter.prototype.valueOf = function() { 
    return this.ounter; 
}; 
Counter.prototype.increment = function() { 
    this.counter += 1; 
}; 
Counter.prototype.decrement = function() { 
    this.counter -= 1; 
}; 
Смежные вопросы