【问题标题】:What is constructor? What kind of function object can be called constructor? [duplicate]什么是构造函数?什么样的函数对象可以称为构造函数? [复制]
【发布时间】:2018-01-29 17:12:33
【问题描述】:

我正在学习 javascript,但我对这个定义感到困惑。 我在 ECMA 中查找,它将构造函数定义为

创建和初始化对象的函数对象。

那么,任何函数对象都可以称为构造函数吗?

【问题讨论】:

  • 构造函数可以被认为是一种定义如何创建对象的模板。函数对象可能会创建一个对象,但此时它可能与构造函数有所不同。
  • 如果你按照规范去,有一部分说:函数对象不一定是构造函数,这样的非构造函数对象没有 [[Construct]] 内部方法。 示例包括箭头函数、方法、Function.prototype、生成器函数和异步函数,它们不是构造函数。

标签: javascript


【解决方案1】:

那么,任何函数对象都可以称为构造函数吗?

但不是每个函数都创建或初始化对象。考虑这个例子:

function add(a, b) {
   return a + b;
}

这个函数只添加两个值。

什么是构造函数?什么样的函数对象可以称为构造函数?

我认为只有打算使用 new 调用的函数才应该被视为“构造函数”(包括通过 class 创建的函数)。

但是,您也可以在不使用 new 调用函数的情况下创建对象:

function getPerson(name) {
   return {name: name};
}

您是否考虑这样的函数构造函数可能是主观的。

【讨论】:

    【解决方案2】:

    在 js 中调用函数 constructor 是很常见的,如果它的目的是用 new 操作符来调用它:

    var me = new Human;//Human is a constructor
    

    然而,人类语言并没有那么严格的定义,所以你可能总是可以使用它,你只需要为你的使用提供好的论据。一个很好的有争议的案例:

    function Animal(name){//actually rather a factory function
      return {name};
    }
    
    var cat = new Animal("bob");//and now ? :/
    

    【讨论】:

    • “其实是一个工厂函数” 我一开始也是这么想的,但是维基百科有这么一点注释:“formally a factory是一个返回的函数或方法不同原型或类的对象”。因此,如果一个函数返回不同“种类”的对象,似乎通常只会将其视为工厂?真的都是语义......
    • @felix kling 现在变得棘手了 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-01-14
    • 2013-11-25
    • 2015-06-10
    • 2012-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多