【问题标题】:What is the difference between these object literals?这些对象字面量之间有什么区别?
【发布时间】:2021-07-30 13:43:34
【问题描述】:

我创建了两个对象。第一个按预期工作。

let working = {constructor: function(){
  console.log("working");
}};

let notworking = {constructor(){
  console.log("notworking");
}}

new working.constructor();
new notworking.constructor();

但是第二个抛出一个错误。错误信息是:

Uncaught TypeError: notworking.constructor is not a constructor

在 Firefox 和 Chrome 上测试。

在 Firefox DevTools 中,对象本身看起来是一样的。构造方法有区别。 工作构造函数具有属性参数、调用者、长度和名称。 不工作的构造函数只有属性长度和名称。

那么这两个对象或构造函数有什么区别呢?

【问题讨论】:

  • 第二个“对象”没有键(用 : 分隔)并且缺少分号
  • 为什么要使用对象字面量表示法来创建带有构造函数的对象?为什么不使用classfunction
  • @NicoRichter:请注意,您可以用任何名称 (foo) 替换 constructor,这仍然成立,普通函数是可构造的,方法(和箭头函数)不是。

标签: javascript


【解决方案1】:

第二种语法是方法语法,它是在 ECMAScript 2015 中引入的。它们几乎等效,但有区别。在第一个对象中,constructor 只是一个键,其值是一个函数。在第二个对象中,constructor 是一个method方法定义不可构造

方法不能是构造函数。如果您尝试实例化它们,它们将抛出 TypeError

发件人:MDN

【讨论】:

  • 很棒的收获。虽然大多数人似乎很清楚箭头函数不能用作构造函数,但这条特殊规则并不为人所知。
  • 感谢您的回答。以前从未听说过这个。有没有办法检查函数是哪种类型并在这些不同的函数类型之间进行转换?我已经看到,如果你创建一个类,方法的属性和方法是一样的。
  • @NicoRichter 不,您不能转换它们 - 它们用于不同的目的。而且您也不应该尝试检查函数的类型,只需尝试使用或不使用new 调用它,如果您的代码的调用者传递了错误的类型,它将引发异常 - 记录您期望的类型,仅此而已.但如果你绝对需要,there are ways to test for functions being constructors。在 ES6 之前,函数上是否存在 .prototype 属性也是一个很好的指标。
猜你喜欢
  • 1970-01-01
  • 2013-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-01
  • 2011-04-10
  • 2016-12-11
相关资源
最近更新 更多