如何在另一个类中使用类实例,例如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;
}
}
如果我想喜欢它,我会在打电话时遇到问题
答案 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()
。这种解决方案似乎是最简单的,但几乎从来没有。类/对象是棘手的东西,但是我很少使用这种解决方案。有使用案例,但通常是难闻的气味指标。