You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

对象字面量中两种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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.29 23:12:44