Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/466.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在子构造函数Javascript ES6类中调用父方法?_Javascript_Es6 Class - Fatal编程技术网

如何在子构造函数Javascript ES6类中调用父方法?

如何在子构造函数Javascript ES6类中调用父方法?,javascript,es6-class,Javascript,Es6 Class,我试图从子构造函数方法调用父构造函数中的方法,但我无法这样做。可以在子类的构造函数中调用父类的方法吗 我们需要这种构造,因为我们需要在不同的作用域中访问此。我创建了一个小示例代码来说明我们的问题: class Foo{ constructor() { this.classMethod = () => { console.log('In Foo'); }; } } class Bar extends Foo{

我试图从子构造函数方法调用父构造函数中的方法,但我无法这样做。可以在子类的构造函数中调用父类的方法吗

我们需要这种构造,因为我们需要在不同的作用域中访问此。我创建了一个小示例代码来说明我们的问题:

class Foo{
    constructor() {
        this.classMethod = () => {
            console.log('In Foo');
        };
    }
}

class Bar extends Foo{
    constructor() {
        super()
        this.classMethod = () => {
            console.log('In Bar');
            super.classMethod(); // How to call the this.classMethod() in Foo?
        };
    }
}

bar = new Bar();
bar.classMethod();
预期结果应为:

In Bar
In Foo
实际产量:

In Bar
TypeError: super.classMethod is not a function
In Bar
In Foo
当classMethod被移到构造函数的范围之外时,一切都按预期工作,除了我们不能访问上面链接的StackOverflow问题中所述的
var self=this

class Foo{
    constructor() { }

    classMethod() {
        console.log('In Foo');
    };

}

class Bar extends Foo{
    constructor() {
        super();
    }

    classMethod () {
        console.log('In Bar');
        super.classMethod();
    };
}

bar = new Bar();
bar.classMethod();
实际产量:

In Bar
TypeError: super.classMethod is not a function
In Bar
In Foo
是否可以通过子类构造函数中的方法调用父类构造函数中的方法?尝试以下操作:

class Foo{
    constructor() {
        this.classMethod = () => {
            console.log('In Foo');
        };
    }
}

class Bar extends Foo{
    constructor() {
        super();
        const originalClassMethod = this.classMethod.bind(this);
        this.classMethod = () => {
            console.log('In Bar');
            originalClassMethod();
        };
    }
}

bar = new Bar();
bar.classMethod();
你的第一次剪发和第二次剪发之间有一个重要的区别。请注意,如果您这样定义一个类:

class Foo {
  someMethod() {
    return 'foo';
  }
}
class Foo {
  constructor() {
    this.someMethod = () => 'foo';
  }
}
然后,如果在控制台中键入:
Foo.prototype.someMethod
,则可以访问该方法。但是,该方法不能绑定到任何实例,因为您还没有使用
new
关键字,对吗

但是,如果您定义这样的类:

class Foo {
  someMethod() {
    return 'foo';
  }
}
class Foo {
  constructor() {
    this.someMethod = () => 'foo';
  }
}
不再是这种情况,因为在第二个示例中,当类被实例化时,在类的实例上定义了属性
someMethod

试试这个

class Foo {
  constructor() {
    this.classMethod = function () {
        console.log('In Foo');
    };
  }
}

class Bar extends Foo{
  constructor() {
    super();
    this.barClassMethod = function () {
        console.log('In Bar');
        this.classMethod(); // How to call the this.classMethod() in Foo?
    };
  }
}

bar = new Bar();
bar.barClassMethod();

另一个技巧是在构造函数中实例化父类并从中调用方法:

class Foo {
  constructor() {
    this.classMethod = () => {
      console.log('In Foo');
    };
  }
}

class Bar extends Foo {
  constructor() {
    super()
    this.classMethod = () => {
      console.log('In Bar');
      (new Foo).classMethod()
    };
  }
}

bar = new Bar();
bar.classMethod()