当函数的行为类似于类但不使用class关键字,也不使用“ new”关键字(在Javascript中)时,该怎么称呼?

时间:2019-01-15 03:28:09

标签: javascript function class constructor terminology

我浏览了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

我知道这很麻烦,但请帮忙!我认为,一旦这个词汇拼图块放好位置,它将使事情在内部点击更多!

4 个答案:

答案 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才能调用该函数。