一个函数能否作为构造函数,要满足一下几个条件:
1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。
2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。
上文定义的构造函数CO就是一个标准的、简单的构造函数。
在你所写的代码中,Person函数中的this指向的是obj对象,而不是Person本身,所以无法当做构造函数使用;
const bar = {
Bar() {}
}
const foo = {
Foo: function () {}
}
上面的不可以new,下面的可以new,只有function这种写法的可以作为构造函数,非function写法的属于简写,只是没有构造器的方法,不是ECMA规范。
8 回答4.6k 阅读✓ 已解决
6 回答3.3k 阅读✓ 已解决
5 回答2.8k 阅读✓ 已解决
5 回答6.3k 阅读✓ 已解决
4 回答2.2k 阅读✓ 已解决
4 回答2.7k 阅读✓ 已解决
3 回答2.4k 阅读✓ 已解决
首先 mdn 上直接有说这个问题:
但结论过于简单,而 ecma规范 里有 Abstract Operations 的说法:
意思就是这些操作不是ECMAScript语言的一部分;它们的定义只是为了帮助规范ECMAScript语言的语义。个人理解就是这些抽象操作是作为ECMAScript语言的辅助操作。比如我们常见的类型转换相关的抽象操作 ToPrimitive。接下来我们找到isconstructor ,该操作就是用来判定一个值是否能作为构造函数:
意思就是类型必须是对象,且拥有[[Construct]]这个内部方法,才能作为构造函数。那么是否表示对象简写方法形式没有[[Construct]]这个内部方法呢?maybe,这个还要继续去看下其它相关规范,待理解清楚后再来继续回答吧。。。