Javascript 使用闭包和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

我试图学习创建对象和对象实例的最佳实践。我理解这样做的一种方法是使用闭包返回一个对象,该对象全部包装为IIF:

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实际上被调用了两次。但我所做的真的是结束了吗?它是函数中的一个函数吗?是的,它是一个闭包。你可能对我感兴趣。