当函数创建新对象但不使用类关键字时,它是什么调用,也不使用“新”关键字(在JavaScript中)? 我似乎找不到像类构造函数一样函数的术语 - 因为它创建了特定“形状”的新对象 - 但不使用新关键字,也不使用类。 (这是一个约束...

问题描述 投票:0回答:3
。 (这是构造函数函数吗?它也没有关键字!)

我在代码中同时使用了这种模式和类,但意识到我不知道如何描述前者。 这个成语的例子:


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

在调用函数之前。
    

javascript function class constructor terminology
3个回答
2
投票
new

等)。

设置为该对象的属性(您存储在

new

中)的函数似乎是类似类方法与实际对象相关的任何方法。

santead,这些函数是closures
,只要功能本身还活着,就可以将对变量的引用保持生存。
为了回答您的问题,您所描述的内容尤其没有任何名称。这只是返回对象的函数。


2
投票

您问为什么在此模式中没有
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();

1
投票

您可以看到,没有

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
的状态。 由于正在使用该变量,因此浏览器的清理过程跳过了它,因此该功能仍然保存在内存中,我相信直到对象被破坏并且不再使用函数的变量为止。
	
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.