Javascript 使用闭包和IIF创建对象实例
我试图学习创建对象和对象实例的最佳实践。我理解这样做的一种方法是使用闭包返回一个对象,该对象全部包装为IIF:Javascript 使用闭包和IIF创建对象实例,javascript,Javascript,我试图学习创建对象和对象实例的最佳实践。我理解这样做的一种方法是使用闭包返回一个对象,该对象全部包装为IIF: myApp2 = (function() { var count = 1; return { getCount: function(){return count}, incCount: function(){count++} }; }()) var test = myApp2 console.log(test.getCount()); // outputs
myApp2 = (function() {
var count = 1;
return {
getCount: function(){return count},
incCount: function(){count++}
};
}())
var test = myApp2
console.log(test.getCount()); // outputs 1
console.log(test.incCount()); // increment count by 1
console.log(test.getCount()); // outputs 2
var test2 = myApp2 // I thought this would create new context
console.log(test2.getCount());// outputs 2, not 1 as expected
请纠正我的理解。如果您想拥有不同的对象,可以使用函数而不是IIFE,并为每个对象调用一次:
function myApp2 () {
var count = 1;
return {
getCount: function(){return count},
incCount: function(){count++}
};
}
var test = myApp2();
console.log(test.getCount()); // outputs 1
console.log(test.incCount()); // increment count by 1
console.log(test.getCount()); // outputs 2
var test2 = myApp2(); // creates new object
console.log(test2.getCount());// outputs 1
如果你看一下myApp2的定义,你会发现它是函数调用的结果。因此,您只需创建另一个引用
test2
,指向myApp2
指向的同一对象,与test
相同。因此,调用test2
上的函数与调用test
上的函数是一样的,因为两者都引用同一个对象。,而不是“IIF”。如何区分“对象”和“对象实例”?对象分配总是通过引用-myApp2==test
和test==test2
。您必须再次调用该函数以创建新的闭包上下文。@Bergi我仍在学习,来自python背景,我希望能够创建已存在的结构(数据+方法)的唯一副本。@ImranNazir:在javascript中,这是不可能的,因为一个结构(尤其是它的方法)可能有一些无法从外部访问的内部状态(如示例中的count
),如果没有明确支持该状态的结构,则无法进行克隆。我想这在python中非常相似,只是你的内部状态要少得多(没有闭包)。我一直在做我所理解的事情,每次调用都会创建一个新的闭包。只有一个这样的调用。在定义匿名函数的地方,也会立即调用它。分配给myApp2的结果就是这个函数调用的结果。好的,我想我看到了。当脚本运行并返回形成闭包的对象时,IIFE将运行一次。所以test和test2指向同一个对象。通过删除IIFE,myApp2实际上被调用了两次。但我所做的真的是结束了吗?它是函数中的一个函数吗?是的,它是一个闭包。你可能对我感兴趣。