在ES6类方法中,如何确保“此”始终指向类本身而不是子类?

时间:2018-11-26 08:50:10

标签: javascript

例如:

class Parent {
    func1() {
        console.log("I am func1, in class Parent");
    }

    func2() {
        this.func1();
    }
}

class Child extends Parent {
    func1() {
        console.log("I am func1, in class Child");
    }
}

let a = new Child();
a.func2();

因为在调用a.func2()时“此”指向Child,所以它将输出“ Child类中的我是func1”。

但是现在我无论如何都希望Parent.func2()在任何情况下都始终调用Parent.func1(),即使“ this”与Child绑定了,我该怎么做?

我尝试了

func2() {
    super.func1();
}

很明显,当父级调用func2()时,它将无法正常工作

let b = new Parent();
b.func2(); //not work

我想要这样的东西:

class Parent {
    func1() {
        console.log("I am func1, in class Parent");
    }

    func2() {
        Parent.func1(); //always access Parent.func1() even if func1() is overrode. 
    }
}

请帮助。

4 个答案:

答案 0 :(得分:4)

没有特殊的语法,您需要显式地引用要精确调用的方法:

class Parent {
    func1() {
        console.log("I am func1, in class Parent");
    }

    func2() {
        Parent.prototype.func1.call(this);
//      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    }
}

答案 1 :(得分:0)

我不知道。这对我有用。还是您还有其他打算?

class Parent {
  constructor(t) {
    this.t = t
    console.log('Parent constructor', t)
  }
  func1() {
    console.log("I am func1, in class Parent", this.t);
  }

  func2() {
    this.func1();
  }
}

class Child extends Parent {
  constructor(t) {
    // super() in constructor calls parent constructor
    super(t);
    console.log('Child constructor', t)
  }
  func1() {
    console.log("I am func1, in class Child", this.t);
  }

  func2() {
    // super refers to the parent class and thus
    // super.func1() calls the func1 of Parent class
    // not Child class
    super.func1();
  }
}

let a = new Child('A');
a.func2();

let b = new Parent('B');
b.func2();

答案 2 :(得分:0)

   class Parent {
		func1() {
			console.log("I am func1, in class Parent");
		}

		func2() {
			this.func1();
		}
	}

class Child extends Parent {
	static func1() {
		console.log("I am func1, in class Child");
	}
}

let a = new Child();
a.func1();
a.func2();
Child.func1(); //Will call child's own static method,instead of parent

我在子类中使用静态方法,这可以选择。

答案 3 :(得分:0)

在ES6中,您可以在声明函数时使用粗箭头语法,这样做的好处是,在函数内部使用 this 时,它将始终指向类实例。因此,您可以像下面这样直接调用它。

class Parent {
    func1= () => {
        console.log("I am func1");
    }

    func2 = () => {
        this.func1();
    }
}