Javascript 闭包与 Javascript OO
Javascript Closure vs Javascript OO
我正在阅读 Closures 并且它有以下闭包的示例。
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 */
我想知道这个闭包和下面产生相同结果的代码之间有什么区别 advantages/disadvantages。
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 */
你的第二个版本也使用了闭包,在这方面几乎没有区别。
重要的区别是你的第一个 makeCounter
是一个工厂,return 是一个对象文字(继承自 Object.prototype
),而你的第二个 makeCounter
是一个构造函数(需要用 new
调用),它执行 return 一个继承自 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;
};
我正在阅读 Closures 并且它有以下闭包的示例。
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 */
我想知道这个闭包和下面产生相同结果的代码之间有什么区别 advantages/disadvantages。
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 */
你的第二个版本也使用了闭包,在这方面几乎没有区别。
重要的区别是你的第一个 makeCounter
是一个工厂,return 是一个对象文字(继承自 Object.prototype
),而你的第二个 makeCounter
是一个构造函数(需要用 new
调用),它执行 return 一个继承自 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;
};