我浏览了suggested链接,但似乎找不到类似于类的函数的术语(它是构造函数吗?也没有该关键字!)但没有使用new
关键字,也不使用class
。
我在代码中同时使用了该示例的模式和类模式,但意识到我不知道如何描述前者。
我认为部分原因是因为我最近学习了JS,看到class
的内容很多,却翻阅了我的 not -ES5,6,7,2018笔记, 2020年等似乎找不到var aCounter = counterFunction()
对我一生的称呼。
我知道我正在做的结果是什么,如何工作等等。但是为什么不constructor()
,不new
,不class
,不{{1 }}模式?我知道我正在创建一个对象,调用该对象内存在的方法,等等。我相信我正在开始漫步。
Lo,一个例子
etc.prototype.etc
是||可以像这样实例化(?):
const counterFunction = () => {
let val = 0
return {
increment() { val++ },
getVal() { return val }
}
}
和
一样let aCounter = counterFunction() // where i'm getting tripped up
我知道这很麻烦,但请帮忙!我认为,一旦这个词汇拼图块放好位置,它将使事情在内部点击更多!
答案 0 :(得分:3)
那只是一个返回对象文字的函数,它不像类(没有原型,并且正如您所指出的那样,不使用new
等)。
被设置为该对象的属性(存储在aCounter
中的函数)的作用类似于类方法,因为它们使对变量val
的引用保持活动状态,但这不是因为val
与实际对象有任何关联。
相反,这些函数是closures,只要函数本身处于活动状态,它们就始终保持对变量的引用。
为回答您的问题,您所描述的内容没有特别的名称。只是一个返回对象的函数。
编辑:
您询问为什么此模式中没有constructor()
或相关语法。 JavaScript中的对象文字只是名称和值的映射:
const x = { a: 3, b: "hello" };
您不需要为此使用构造函数,也没有原型,因为没有使用构造函数实例化它。另一方面,类和构造函数是将在以后创建的对象的模板,而这些对象 do 具有原型和构造函数,因为模板包含用于初始化的逻辑对象。
class A
{
constructor()
{
this.a = new Date();
this.b = this.a.toString(); // you cannot do this in an object literal
}
}
const x = new A();
答案 1 :(得分:1)
您显示的内容没有什么特别的。这只是一个具有闭包的普通函数。
不过,您可以将其称为design pattern类型。
它看起来与Revealing Module Pattern类似,您可以在其中分隔公共财产和私有财产。
下面是一个例子(不是一个很好的例子):
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
。
答案 2 :(得分:1)
我可以看到您可能会被绊倒,让我们看一下代码并探讨发生了什么:
const counterFunction = () => {
let val = 0
return {
increment() { val++ },
getVal() { return val }
}
}
此时counterFunction
是一个指向函数的变量,它实际上是一个函数名。 ()=>{...}
是函数主体或函数定义,并且其中的return
语句显示它返回了具有两个属性方法的未命名对象。
let aCounter = counterFunction() // where i'm getting tripped up
这将调用您先前定义的函数,该函数再次使用两种方法返回该对象并将其分配给变量aCounter
。如果您再次对名为bCounter
的变量执行相同的操作,则它们将包含两个独立的对象。
and works like
aCounter.increment() // 1
aCounter.increment() // 2
aCounter.getVal() // 2
因为对象内部的方法引用对象范围之外但在函数体内的变量,所以创建了闭包,以便可以保留val
的状态。由于该变量正在使用中,因此浏览器的清理过程会跳过它,因此该功能仍保留在内存中,我相信直到对象被销毁并且该功能的变量不再使用为止。
答案 3 :(得分:1)
问题:
当函数的行为类似于类但不使用class关键字,也不使用“ new”关键字(在Javascript中)时,该怎么称呼?
答案:
它被称为“工厂功能”。
工厂函数通常返回一致类型的对象,但不是工厂函数本身的实例。返回的对象很少会继承自工厂函数的prototype
属性,并且调用工厂函数不需要new
才能调用该函数。