如何在具有继承的 class 中使用回调函数
How to use a callback function in a class with inheritance
如何在子方法中使用父方法作为回调函数
class Parent {
numbers: number[];
constructor(numbers: number[]) {
this.numbers = numbers;
}
protected iterateNumbers(iterCallback: (nb: number) => void): void {
for (const nb of this.numbers) {
iterCallback(nb);
}
}
protected inc(nb: number): number {
return nb++;
}
}
class Child extends Parent {
constructor(numbers: number[]) {
super(numbers)
}
getNumbers(): void {
this.iterateNumbers(this.displayNumber);
}
private displayNumber(nb: number): void {
console.log(this.inc(nb));
}
}
const c = new Child([1, 2, 3, 4, 5]);
c.getNumbers();
此代码导致此错误:TypeError: Cannot read property 'inc' of undefined
修改为 super()
您需要在子 class 的构造函数中调用 super 方法才能访问 super class.
的属性和方法
此外,由于您拥有私有的 displayNumber
方法,您将无法从 child
class 创建的对象访问它。删除 private 关键字将允许访问
尝试更改您的扩展子项以包含构造函数方法和超级调用:
class Child extends Parent {
constructor() {
super()
}
getNumbers(): void {
this.iterateNumbers(this.displayNumber);
}
displayNumber(nb: number): void {
console.log(this.inc(nb));
}
}
您可以在 MDN docs on the super keyword
中阅读更多内容
更新:
经过一些测试后,我找到了解决您为什么会收到该错误的解决方案,当然这完全与上下文有关。如果您将 inc
方法设为静态,您将能够通过 Parent.inc()
调用它
通过将 displayNumber
方法作为回调传递,您将失去要从中调用它的 class 的上下文。这就是您收到未定义错误的原因。
class Parent {
numbers: number[];
constructor(numbers: number[]) {
this.numbers = numbers;
}
protected iterateNumbers(iterCallback: (nb: number) => void): void {
for (const nb of this.numbers) {
iterCallback(nb);
}
}
static inc(nb: number): number {
return nb++;
}
}
class Child extends Parent {
constructor(numbers: number[]) {
super(numbers)
}
getNumbers(): void {
this.iterateNumbers(this.displayNumber);
}
private displayNumber(nb: number): void {
console.log(Parent.inc(nb));
}
}
const c = new Child([1, 2, 3, 4, 5]);
c.getNumbers(); // prints 1 2 3 4 5
如果你运行这个代码你会看到打印出来的数字。
现在,通过在 child
构造函数中调用 super 方法并将 inc
方法更新为静态方法,然后这样调用它,我想您会得到预期的结果。
找到了一种方法来做同样的事情,但使用 none 静态方法
ES6 风格允许您使用新功能,例如 super 关键字。当您使用 ES6 classes 语法时,super 关键字全都与父 class 上下文有关。
class Parent {
numbers: number[];
constructor(numbers: number[]) {
this.numbers = numbers;
}
protected iterateNumbers(predictionCallback: (nb: number) => void): void {
for (const nb of this.numbers) {
predictionCallback(nb);
}
}
protected inc(nb: number): number {
return nb++;
}
}
class Child extends Parent {
constructor(numbers: number[]) {
super(numbers)
}
getNumbers() {
this.iterateNumbers(this.displayNumber);
}
private displayNumber(nb: number): void {
console.log(super.inc(nb));
}
}
const c = new Child([1, 2, 3, 4, 5]);
c.getNumbers();
如何在子方法中使用父方法作为回调函数
class Parent {
numbers: number[];
constructor(numbers: number[]) {
this.numbers = numbers;
}
protected iterateNumbers(iterCallback: (nb: number) => void): void {
for (const nb of this.numbers) {
iterCallback(nb);
}
}
protected inc(nb: number): number {
return nb++;
}
}
class Child extends Parent {
constructor(numbers: number[]) {
super(numbers)
}
getNumbers(): void {
this.iterateNumbers(this.displayNumber);
}
private displayNumber(nb: number): void {
console.log(this.inc(nb));
}
}
const c = new Child([1, 2, 3, 4, 5]);
c.getNumbers();
此代码导致此错误:TypeError: Cannot read property 'inc' of undefined
修改为 super()
您需要在子 class 的构造函数中调用 super 方法才能访问 super class.
的属性和方法此外,由于您拥有私有的 displayNumber
方法,您将无法从 child
class 创建的对象访问它。删除 private 关键字将允许访问
尝试更改您的扩展子项以包含构造函数方法和超级调用:
class Child extends Parent {
constructor() {
super()
}
getNumbers(): void {
this.iterateNumbers(this.displayNumber);
}
displayNumber(nb: number): void {
console.log(this.inc(nb));
}
}
您可以在 MDN docs on the super keyword
中阅读更多内容更新:
经过一些测试后,我找到了解决您为什么会收到该错误的解决方案,当然这完全与上下文有关。如果您将 inc
方法设为静态,您将能够通过 Parent.inc()
通过将 displayNumber
方法作为回调传递,您将失去要从中调用它的 class 的上下文。这就是您收到未定义错误的原因。
class Parent {
numbers: number[];
constructor(numbers: number[]) {
this.numbers = numbers;
}
protected iterateNumbers(iterCallback: (nb: number) => void): void {
for (const nb of this.numbers) {
iterCallback(nb);
}
}
static inc(nb: number): number {
return nb++;
}
}
class Child extends Parent {
constructor(numbers: number[]) {
super(numbers)
}
getNumbers(): void {
this.iterateNumbers(this.displayNumber);
}
private displayNumber(nb: number): void {
console.log(Parent.inc(nb));
}
}
const c = new Child([1, 2, 3, 4, 5]);
c.getNumbers(); // prints 1 2 3 4 5
如果你运行这个代码你会看到打印出来的数字。
现在,通过在 child
构造函数中调用 super 方法并将 inc
方法更新为静态方法,然后这样调用它,我想您会得到预期的结果。
找到了一种方法来做同样的事情,但使用 none 静态方法
ES6 风格允许您使用新功能,例如 super 关键字。当您使用 ES6 classes 语法时,super 关键字全都与父 class 上下文有关。
class Parent {
numbers: number[];
constructor(numbers: number[]) {
this.numbers = numbers;
}
protected iterateNumbers(predictionCallback: (nb: number) => void): void {
for (const nb of this.numbers) {
predictionCallback(nb);
}
}
protected inc(nb: number): number {
return nb++;
}
}
class Child extends Parent {
constructor(numbers: number[]) {
super(numbers)
}
getNumbers() {
this.iterateNumbers(this.displayNumber);
}
private displayNumber(nb: number): void {
console.log(super.inc(nb));
}
}
const c = new Child([1, 2, 3, 4, 5]);
c.getNumbers();