如何在另一个类中使用类函数?

时间:2019-04-22 21:34:32

标签: node.js class

如何在另一个类中使用类实例,例如C ++中的指向类实例函数的指针?

示例:

 let watcher: chokidar.FSWatcher | undefined
 watcher = chokidar.watch(dirname, { persistent: true })
 watcher
   .on('add', (filePath: string) => handleOnAddFile(filePath))
   .on('addDir', (filePath: string) => console.log(`DETECTED => add directory ${filePath}`))
   .on('change', (filePath: string) => handleOnChange(filePath))
   .on('error', (error: string) => console.log(`DETECTED => watcher error: ${error}`))
   .on('ready', () => console.log('Initial scan complete. Ready for changes'))
   .on('unlink', (filePath: string) => handleOnUnlink(filePath))
   .on('unlinkDir', (filePath: string) => console.log(`DETECTED => remove directory ${filePath}`))

另一堂课:

class A {
    constructor()
    { 
       this.block = [];
    }

    method()
    {
       return this.blocks.length;
    }
}

如果我想喜欢它,我会在打电话时遇到问题

3 个答案:

答案 0 :(得分:1)

您可以通过调用js这样的静态方法轻松地在JS中执行此操作:

class A {
  static write(){  //static method
    console.log("Called write from A");
  }
}

class B {
   doIt(){
     A.write();
   }
}


let b = new B();
b.doIt();

选项2,您可以像这样在另一个的构造函数中实例化该类:


class A {
  write(){
    console.log("Non-static write() called from class A");
  }
}

class B {
   constructor() {
       this.a = new A();
   }

   doIt(){
     this.a.write();
   }
}

let b = new B();
b.doIt();


答案 1 :(得分:1)

您可以尝试一下。在这里,当创建B类的实例时,我将A类的实例作为参数。然后在B内部,我们可以调用A实例的方法,并访问其属性。

此外,正如@ViaTech发布的那样,您可以使用静态方法来访问它们,而无需初始化该类的对象。那就是静态方法。请参阅Static Methods

class B {
    constructor(instance)
    {
        this.instance = instance;
    }

    method()
    {
        this.instance.method();
    }
}
class A {
    constructor()
    {

    }

    method()
    {
    console.log("A's method");
    }
}

var a = new A();
var b = new B(a);
b.method(); // A's method

答案 2 :(得分:1)

有几种方法:
我不小心在PHP和Javascript之间切换,但是两者的原理相同)

使用静态功能:

通常,您在课程中有一个this。假设您有以下代码:

class Car {
    let color;
    public function setColor(newColor){ this.color = newColor;}
}
let car = new Car(); 
car->setColor('green')`

setColor函数的this指的是那个 car。您可以制造let anotherCar = new Car(),然后当您进行anotherCar->setColor('red')时,您只需更换那辆 汽车,而不是第一辆。简单化:您可以创建多个实例。

如果您不需要它,但只需要一次该类,则可以使其变为静态。一种简单的解释方法是“您有一组单独的函数,只是放入了包装类中(实际上并没有很多作用)”。例如,您可能有一些清理方法:

class Sanitize {
    static function makeHtmlSave(input){
        return doYourMagicHere(input);
    }
    static function removeXssCode(input){
        return doMoreMagicHere(input);
    }
}

这样,您可以多次重用它。如果要使用它,请在需要的地方进行Sanitize::makeHtmlSave(someCode)。没有Sanitize 事物,它只是一个包装器,用于访问其中的函数。


使用扩展:

您可以扩展课程。假设您有一个通用类Vehicle,它具有一些属性(例如,马达,numberWeels,颜色),并且可以使用更具体的类对其进行扩展:

class Vehicle {
    let color;
    public function setColor(newColor){ this.color = newColor}
}
class Car extends Vehicle {
    let hasAirco = false;
    public function hasAirco(newValue){ this.hasAirco = newValue};
}

如果您执行let car = new Car(),则会得到一个Car对象,该对象扩展/放大/补充Vehicle类,因此您可以使用其(公共)功能。在内部,Car也可以使用Vehicle的功能。


只需通过

class One {
   // some stuff
}

class Two{
    let otherObject;
    construct(givenObject){
        this.otherObject = givenObject;
    }
}

您现在可以let a = new One(); let b = new Two(a);执行此操作。您可以使用“二合一”功能,但仍可以使用a->doSomething()。这种解决方案似乎是最简单的,但几乎从来没有。类/对象是棘手的东西,但是我很少使用这种解决方案。有使用案例,但通常是难闻的气味指标。