【Web前端问题】js对象方法简写为什么不能用new关键字调用呢?
回答:
首先 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,这个还要继续去看下其它相关规范,待理解清楚后再来继续回答吧。。。
回答:
https://developer.mozilla.org...
回答:
一个函数能否作为构造函数,要满足一下几个条件:
1、 在函数内部对新对象(this)的属性进行设置,通常是添加属性和方法。
2、 构造函数可以包含返回语句(不推荐),但返回值必须是this,或者其它非对象类型的值。
上文定义的构造函数CO就是一个标准的、简单的构造函数。
在你所写的代码中,Person函数中的this指向的是obj对象,而不是Person本身,所以无法当做构造函数使用;
回答:
const bar = { Bar() {}
}
const foo = {
Foo: function () {}
}
上面的不可以new,下面的可以new,只有function这种写法的可以作为构造函数,非function写法的属于简写,只是没有构造器的方法,不是ECMA规范。
以上是 【Web前端问题】js对象方法简写为什么不能用new关键字调用呢? 的全部内容, 来源链接: utcz.com/a/142045.html