我在代码中同时使用了这种模式和类,但意识到我不知道如何描述前者。 这个成语的例子:
const makeCounter = () => {
let val = 0;
return {
increment() { val++; },
getVal() { return val; },
};
};
let aCounter = makeCounter();
aCounter.increment();
aCounter.increment();
console.log(aCounter.getVal()); //= 2
makeCounter
prototype
在调用函数之前。
new
等)。
设置为该对象的属性(您存储在new
中)的函数似乎是类似类方法与实际对象相关的任何方法。 santead,这些函数是closures,只要功能本身还活着,就可以将对变量的引用保持生存。
为了回答您的问题,您所描述的内容尤其没有任何名称。这只是返回对象的函数。
您问为什么在此模式中没有
aCounter
或相关语法。 JavaScript中的对象文字只是名称和值的映射:
val
您不需要构造函数,并且没有原型,因为它不是使用构造函数实例化的。另一方面,类和构造函数函数是templates
,对于以后将创建的对象,并且这些对象具有原型和构造函数,因为模板包含初始化对象的逻辑。
val
,尽管您可以称其为一种deSignpattern.。
看起来类似于Revealing Module模式您可以在其中分开公共财产和私有财产。 贝洛是一个例子(不是一个很好的例子):
constructor()
,您无法直接操纵我不暴露于您的私人变量。 您只有在将功能公开给您时只能操纵这些私人变量。在这种情况下,
const x = { a: 3, b: "hello" };
和
class A
{
constructor()
{
this.a = new Date();
this.b = this.a.toString(); // you cannot do this in an object literal
}
}
const x = new A();
您可以看到,没有
var counter = function(){
var privateCount = 0;
var privateHistory = [];
return {
getVal: function(){
return privateCount;
},
increment: function(){
privateCount++;
privateHistory.push('+');
return this.getVal();
},
decrement: function(){
privateCount--;
privateHistory.push('-');
return this.getVal();
},
publicHistory: function(){
return privateHistory;
}
}
}
var aCounter = counter();
console.log(aCounter.increment());
console.log(aCounter.decrement());
console.log(aCounter.publicHistory());
,没有.increment()
,没有
.decrement()
我可以看到您如何被绊倒,让我们浏览您的代码,探索正在发生的事情:
class
在此点
prototype
constructor
是函数主体或函数定义,其中const counterFunction = () => {
let val = 0
return {
increment() { val++ },
getVal() { return val }
}
}
counterFunction
this正在调用您先前定义的函数,该功能再次使用两种方法返回对象,并将其分配给变量
()=>{...}
。 如果您再次为一个称为
return
的变量做同样的事情,他们将拥有两个独立的对象。
let aCounter = counterFunction() // where i'm getting tripped up
由于对象内部的方法是指物体范围之外的变量,但是在功能正文中,创建了闭合,以便可以保留
aCounter
的状态。 由于正在使用该变量,因此浏览器的清理过程跳过了它,因此该功能仍然保存在内存中,我相信直到对象被破坏并且不再使用函数的变量为止。