4 个回答

首先 mdn 上直接有说这个问题:

All method definitions are not constructors and will throw a TypeError if you try to instantiate them.

但结论过于简单,而 ecma规范 里有 Abstract Operations 的说法:

These operations are not a part of the ECMAScript language; they are defined here to solely to aid the specification of the semantics of the ECMAScript language. Other, more specialized abstract operations are defined throughout this specification.

意思就是这些操作不是ECMAScript语言的一部分;它们的定义只是为了帮助规范ECMAScript语言的语义。个人理解就是这些抽象操作是作为ECMAScript语言的辅助操作。比如我们常见的类型转换相关的抽象操作 ToPrimitive。接下来我们找到isconstructor ,该操作就是用来判定一个是否能作为构造函数:

If Type(argument) is not Object, return false.
If argument has a [[Construct]] internal method, return true.
Return false.

意思就是类型必须是对象,且拥有[[Construct]]这个内部方法,才能作为构造函数。那么是否表示对象简写方法形式没有[[Construct]]这个内部方法呢?maybe,这个还要继续去看下其它相关规范,待理解清楚后再来继续回答吧。。。

一个函数能否作为构造函数,要满足一下几个条件:
1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。
2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。
上文定义的构造函数CO就是一个标准的、简单的构造函数。

在你所写的代码中,Person函数中的this指向的是obj对象,而不是Person本身,所以无法当做构造函数使用;

const bar = {
  Bar() {}
}

const foo = {
  Foo: function () {}
}

上面的不可以new,下面的可以new,只有function这种写法的可以作为构造函数,非function写法的属于简写,只是没有构造器的方法,不是ECMA规范。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏