为了账号安全,请及时绑定邮箱和手机立即绑定

如何让 ES6 类方法在调用子类函数时执行一些默认行为,而不使用超级构造函数?

如何让 ES6 类方法在调用子类函数时执行一些默认行为,而不使用超级构造函数?

aluckdog 2023-08-24 17:59:13
因此,在尝试构建一些 js 类时,我遇到了一些知识差距,因为这是我第一次实现 OOP 和 ES6 构造函数。我基本上有一个运行一个respond()方法的应用程序,当在"Emergency Event".在此示例中,无论子类方法中声明了什么,派生自的所有子类都NuclearStrategy应该始终如此。如果那么除了 之外什么都不应该做。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 });这执行✅ Appeasing the population✅ Playing alert siren✅ Launched ICBM nuke to enemy应该只执行✅ Appeasing the populationAction.respondToThreat这样,即使警报只是针对(RIP Earth) ,我也无法阻止核武器发射nuclear test。另外,我不能super在我的子类中进行任何调用super.respondToThreat(),该appeaseAllPopulation()行为应该默认执行,而无需调用它。您对这个应用程序有什么建议吗?先感谢您。
查看完整描述

2 回答

?
红糖糍粑

TA贡献1815条经验 获得超6个赞

一个简单的解决方案是根本不重写respondToThreat,而是调用应由子类实现的方法/挂钩。


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


查看完整回答
反对 回复 2023-08-24
?
守候你守候我

TA贡献1802条经验 获得超10个赞

如果您想防止程序员重写重要方法,您可以只传递要执行的逻辑,而不是子类化。在这种情况下,调用逻辑的类应该记录在什么情况下执行什么逻辑。传递的参数是什么以及期望的返回值应该是什么。


上面的内容可以通过很多不同的方式来完成,下面是一个例子:


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


查看完整回答
反对 回复 2023-08-24
  • 2 回答
  • 0 关注
  • 161 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信