【发布时间】:2015-08-21 18:41:15
【问题描述】:
给定一个简单的类
class Foo {
constructor(x) {
if (!(this instanceof Foo)) return new Foo(x);
this.x = x;
}
hello() {
return `hello ${this.x}`;
}
}
是否可以在没有new关键字的情况下调用类构造函数?
使用应该允许
(new Foo("world")).hello(); // "hello world"
或者
Foo("world").hello(); // "hello world"
但后者失败了
Cannot call a class as a function
【问题讨论】:
-
请记住,解决方法是只定义一个工厂函数(名称略有不同),它只执行
return new Foo(arg);。 -
是的,我考虑过这个,但是构造函数名称和类名称之间存在不对称:{
-
有趣。 JS 程序员已经习惯于用“new”来调用构造函数。节省一些输入,有时使代码看起来更优雅,并且是错误和混乱的一大来源。看看这种做法在几年后会发生怎样的变化会很有趣。
-
@user949300 我几乎总是使用
new关键字。我打算将其用于其他用途。 -
@user949300 我已经放弃了 javascript 以支持 coffeescript。 ES6 和 ES7 包含很多天才特性,但它的新
the ugliest语法令人恐惧。而且新的关键字也丑得要命。只需将Foo().bar()代码与(new Foo()).bar()进行比较。糟透了。创建新对象如此重要的是什么?创建对象是家常便饭,我不需要特殊的语法。
标签: javascript constructor ecmascript-6 instance