第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

ES6:沒有new關(guān)鍵字的調(diào)用類構(gòu)造函數(shù)

ES6:沒有new關(guān)鍵字的調(diào)用類構(gòu)造函數(shù)

溫溫醬 2019-08-28 09:25:46
ES6:沒有new關(guān)鍵字的調(diào)用類構(gòu)造函數(shù)給出一個(gè)簡單的類class Foo {   constructor(x) {     if (!(this instanceof Foo)) return new Foo(x);     this.x = x;   }   hello() {     return `hello ${this.x}`;   }}是否可以在沒有new關(guān)鍵字的情況下調(diào)用類構(gòu)造函數(shù)?用法應(yīng)該允許(new Foo("world")).hello(); // "hello world"要么Foo("world").hello();       // "hello world"但后者失敗了Cannot call a class as a function
查看完整描述

3 回答

?
長風(fēng)秋雁

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) };


查看完整回答
反對 回復(fù) 2019-08-28
?
慕桂英3389331

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 FooFunction 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類的可行解決方案。


查看完整回答
反對 回復(fù) 2019-08-28
  • 3 回答
  • 0 關(guān)注
  • 731 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)