对象字面量中两种constructor定义方式的差异及调用报错原因解析
两种对象
constructor方法的核心差异解析 这个问题的关键在于ES6对象方法简写语法和传统函数赋值语法定义的函数,内部特性完全不同,具体差异如下:
第一种写法(可正常工作):
let working = {constructor: function(){ console.log("working"); }};这里是把一个普通的函数表达式赋值给了对象的
constructor属性。这类函数具备完整的函数特性,包括内置的[[Construct]]内部方法——这是让函数能被new关键字调用作为构造函数的核心特性。
也正因为它是普通函数,所以会包含arguments、caller、length、name这些标准属性,和你在开发者工具里观察到的一致。第二种写法(无法工作):
let notworking = {constructor(){ console.log("notworking"); }}这是ES6引入的对象方法简写语法,这种方式定义的函数会被JS引擎特殊处理:它会被标记为「不可构造」,也就是直接移除了
[[Construct]]内部方法。因此当你尝试用new调用它时,就会抛出TypeError: notworking.constructor is not a constructor的错误。
同时,这类方法简写的函数默认不会携带arguments、caller这些属性,这也解释了你在Firefox开发者工具里看到的属性差异。
简单来说,方法简写语法是为了定义对象的普通方法(用来直接调用,而非作为构造函数)设计的,所以JS引擎刻意禁用了它的构造能力;而传统的函数赋值方式定义的函数,保留了所有普通函数的特性,自然可以被当作构造函数使用。
内容的提问来源于stack exchange,提问作者Nico Richter
相关产品推荐
相关产品推荐

