3 回答

TA貢獻(xiàn)1757條經(jīng)驗(yàn) 獲得超7個(gè)贊
類有一個(gè)“類體”,它是一個(gè)構(gòu)造函數(shù)。
如果使用內(nèi)部constructor()
函數(shù),那么該函數(shù)也將是同一個(gè)類體,并且將在調(diào)用類時(shí)調(diào)用,因此類始終是構(gòu)造函數(shù)。
構(gòu)造函數(shù)需要使用的new
運(yùn)算符來創(chuàng)建一個(gè)新的實(shí)例,因此調(diào)用類沒有new
一個(gè)錯(cuò)誤操作的結(jié)果,因?yàn)樗?em>需要的類的構(gòu)造函數(shù)來創(chuàng)建一個(gè)新的實(shí)例。
錯(cuò)誤消息也非常具體,而且正確
TypeError:沒有'new'時(shí)不能調(diào)用類構(gòu)造函數(shù)
你可以;
使用常規(guī)函數(shù)而不是類1。
總是打電話給班級(jí)
new
。在包裝常規(guī)函數(shù)中調(diào)用類,總是使用
new
,這樣你就可以獲得類的好處,但是使用和不使用new
運(yùn)算符2仍然可以調(diào)用包裝函數(shù)。
1)
function Foo(x) { if (!(this instanceof Foo)) return new Foo(x); this.x = x; this.hello = function() { return this.x; }}
2)
class Foo { constructor(x) { this.x = x; } hello() { return `hello ${this.x}`; }}var _old = Foo;Foo = function(...args) { return new _old(...args) };

TA貢獻(xiàn)2036條經(jīng)驗(yàn) 獲得超8個(gè)贊
正如其他人已經(jīng)指出的那樣,ES2015規(guī)范嚴(yán)格規(guī)定這樣的調(diào)用應(yīng)該拋出TypeError,但同時(shí)它提供了可用于實(shí)現(xiàn)所需結(jié)果的功能,即Proxies。
代理允許我們虛擬化對象的概念。例如,它們可用于更改特定對象的某些行為,而不會(huì)影響其他任何內(nèi)容。
在您的特定使用案例class Foo
是Function object
可以稱之為-這通常意味著該函數(shù)的身體將被執(zhí)行。但這可以通過以下方式改變Proxy
:
const _Foo = new Proxy(Foo, { // target = Foo apply (target, thisArg, argumentsList) { return new target(...argumentsList); }});_Foo("world").hello(); const f = _Foo("world");f instanceof Foo; // truef instanceof _Foo; // true
(注意,_Foo
現(xiàn)在是您要公開的類,因此標(biāo)識(shí)符可能應(yīng)該是另一種方式)
如果由支持Proxies的瀏覽器運(yùn)行,則調(diào)用_Foo(...)
現(xiàn)在將執(zhí)行apply
陷阱功能而不是orignal構(gòu)造函數(shù)。
同時(shí),這個(gè)“新” _Foo
類與原始類無法區(qū)分Foo
(除了能夠?qū)⑵浞Q為正常函數(shù))。類似地,你可以告訴使用Foo
和創(chuàng)建的對象沒有區(qū)別_Foo
。
最大的缺點(diǎn)是它無法被發(fā)現(xiàn)或被pollyfilled,但它仍然是未來可能在JS中應(yīng)用Scala類的可行解決方案。
添加回答
舉報(bào)