我有两个类:首先检查文件是否存在并且有效。第二个用该文件做一些事情:

class Validator {
   constructor(){
      this.file = './file.json';
   }
   check(){ ... }
}

class Modificator {
   action1(){ ... }
   action2(){ ... }
}


我想要的是第一类的方法自动在第二类的每个方法内部调用。
这有点棘手,但是我真的不想手动进行操作,如下所示:

class Validator {
   constructor(){
      this.file = './file.json';
   }
   static check(){ ... }
}

class Modificator {
   action1(){
      let status = Validator.check();
      ...
   }
   action2(){
      let status = Validator.check();
      ...
   }
}

最佳答案

通过使用包装器




class Validator {
  static check () {console.log('checked')}
  static checkCbk (fn) {
    return _ => {
      this.check()
      //then callback
      fn()
    }
  }
}
class Modificator {
  //via public instance field
  action1 = Validator.checkCbk(function () {
    console.log('mod::action1')
  })
}
//or by prototype
Modificator.prototype.action2 = Validator.checkCbk(function(){
  console.log('mod::action2')
})
var m = new Modificator()
m.action1()
m.action2()





但是请注意,如果要继承Modificator的子类,则可能会忘记重新包装方法...


通过签订合同


更常见的是订立合同,并在履行合同时委派给象征。

这样一来,您就不必担心扩展,因为无论如何检查都是在基类中进行的。



class Validator {
  static check () {console.log('checked')}
}
class Contract {
  action1 () {
    Validator.check()
    this._action1()
  }
}
class M2 extends Contract {
  _action1 () {
    console.log('mod2::action1')
  }
}
var m = new M2()
m.action1()

关于javascript - 从另一个类调用方法时从一个类调用方法,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/59319817/

10-09 17:56
查看更多