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

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

如何讓 ES6 類方法在調(diào)用子類函數(shù)時執(zhí)行一些默認(rèn)行為,而不使用超級構(gòu)造函數(shù)?

如何讓 ES6 類方法在調(diào)用子類函數(shù)時執(zhí)行一些默認(rèn)行為,而不使用超級構(gòu)造函數(shù)?

aluckdog 2023-08-24 17:59:13
因此,在嘗試構(gòu)建一些 js 類時,我遇到了一些知識差距,因為這是我第一次實現(xiàn) OOP 和 ES6 構(gòu)造函數(shù)。我基本上有一個運(yùn)行一個respond()方法的應(yīng)用程序,當(dāng)在"Emergency Event".在此示例中,無論子類方法中聲明了什么,派生自的所有子類都NuclearStrategy應(yīng)該始終如此。如果那么除了 之外什么都不應(yīng)該做。Appease the populationActionrespondToThreat()eventIsJustTest === trueAppease the population這就是我正在實施的:class NuclearStrategy {  constructor(props) {    this.eventOrigin = props.eventOrigin;  }  appeaseAllPopulation() {    console.log('? Appeasing the population');  }  respondToThreat({ eventIsJustTest }) {    this.appeaseAllPopulation();    if (eventIsJustTest) return;                            // I expect this to exit the function and ignore anything declared after <super.respondToThreat()>  }}class Action extends NuclearStrategy {  constructor(props) {    super(props)  }  respondToThreat(responseArgs) {    super.respondToThreat(responseArgs.eventIsJustTest);   // <- I can't have this in my code    console.log(`? Playing alert siren`);                 // <- This shouldn't be executed    console.log(`? Launched ICBM nuke to enemy`)          // <- Avoid also  }}new Action({ eventOrigin: 'East Qorea' }).respondToThreat({ eventIsJustTest: true });這執(zhí)行? Appeasing the population? Playing alert siren? Launched ICBM nuke to enemy應(yīng)該只執(zhí)行? Appeasing the populationAction.respondToThreat這樣,即使警報只是針對(RIP Earth) ,我也無法阻止核武器發(fā)射nuclear test。另外,我不能super在我的子類中進(jìn)行任何調(diào)用super.respondToThreat(),該appeaseAllPopulation()行為應(yīng)該默認(rèn)執(zhí)行,而無需調(diào)用它。您對這個應(yīng)用程序有什么建議嗎?先感謝您。
查看完整描述

2 回答

?
紅糖糍粑

TA貢獻(xiàn)1815條經(jīng)驗 獲得超6個贊

一個簡單的解決方案是根本不重寫respondToThreat,而是調(diào)用應(yīng)由子類實現(xiàn)的方法/掛鉤。


class NuclearStrategy {

  constructor(props) {

    this.eventOrigin = props.eventOrigin;

  }


  appeaseAllPopulation() {

    console.log('Broadcasting ');

  }


  respondToThreat({ eventIsJustTest }) {

    console.log(`? Appeasing the population`);

    if (eventIsJustTest) return;

    this.respondToNonTestThreat();

  }

  

  respondToNonTestThreat() {} // default implementation do nothing

}


class Action extends NuclearStrategy {

  respondToNonTestThreat() {

    console.log(`? Playing alert siren`);

    console.log(`? Launched ICBM nuke to enemy`);

  }

}


const action = new Action({ eventOrigin: 'East Qorea' });


console.log("test threat:");

action.respondToThreat({ eventIsJustTest: true });

console.log("non-test threat:");

action.respondToThreat({});


查看完整回答
反對 回復(fù) 2023-08-24
?
守候你守候我

TA貢獻(xiàn)1802條經(jīng)驗 獲得超10個贊

如果您想防止程序員重寫重要方法,您可以只傳遞要執(zhí)行的邏輯,而不是子類化。在這種情況下,調(diào)用邏輯的類應(yīng)該記錄在什么情況下執(zhí)行什么邏輯。傳遞的參數(shù)是什么以及期望的返回值應(yīng)該是什么。


上面的內(nèi)容可以通過很多不同的方式來完成,下面是一個例子:


class Hooks {

  constructor(hooks, context) {

    this.hooks   = hooks;

    this.context = context;

  }

  

  find(...path) {

    let cursor = this.hooks;

    for (const key of path) {

      if (!cursor[key]) return this.noop;

      cursor = cursor[key];

    }

    return cursor.bind(this.context);

  }

  

  noop() {}

}


class NuclearStrategy {

  static withPresetHooks(hooks) {

    return (props) => new this({ ...props, hooks });

  }


  constructor(props) {

    this.eventOrigin = props.eventOrigin;

    this.hooks       = new Hooks(props.hooks || {}, this);

  }


  appeaseAllPopulation() {

    console.log('Broadcasting ');

  }


  respondToThreat({ eventIsJustTest }) {

    console.log(`? Appeasing the population`);

    this.hooks.find("respondToThreat", "eventIsJustTest", !!eventIsJustTest)();

  }

}


const createAction = NuclearStrategy.withPresetHooks({

  respondToThreat: {

    eventIsJustTest: {

      true: function () {

        console.log(`? Testing alert siren`);

      },

      false: function () {

        console.log(`? Playing alert siren`);

        console.log(`? Launched ICBM nuke to enemy`);

      },

    },

  },

});


const action = createAction({ eventOrigin: 'East Qorea' });


console.log("test threat:");

action.respondToThreat({ eventIsJustTest: true });

console.log("non-test threat:");

action.respondToThreat({});


查看完整回答
反對 回復(fù) 2023-08-24
  • 2 回答
  • 0 關(guān)注
  • 238 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

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

幫助反饋 APP下載

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

公眾號

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