Правильный способ вызова функций суперкласса из подкласса

у меня есть " суперкласс "с" info " в качестве переменной экземпляра. "Суперкласс" имеет функцию " printInfo ()". "printInfo () "должен получить доступ к переменной экземпляра"info". Я хочу создать "подкласс", который также имеет метод"printInfo ()". Я хочу вызвать printInfo () " суперкласса "из" printInfo () "из"подкласса".

SuperClass = function()
{
    this.info = "I am superclass";
    console.log("SuperClass:");
};

SuperClass.prototype.printInfo = function(that)
{
    console.log("printing from superclass printInfo");
    console.log(that.info);
};

SubClass = function(){};

SubClass.prototype = new SuperClass();

SubClass.prototype.printInfo = function()
{
    console.log("calling superclass");
    this.constructor.prototype.printInfo(this);
    console.log("called superclass");
};

var sc = new SubClass();
sc.printInfo();

вы можете видеть, что я передаю "это" в качестве параметра printInfo. Без параметра" that ""info" печатается как "undefined". Как в следующем случае, "this.info" не определено, когда эта функция вызывается из объекта "подкласса".

SuperClass.prototype.printInfo = function()
    {
        console.log("printing from superclass printInfo");
        console.log(this.info);
    };

каков правильный способ переопределения и вызова методов суперкласса в javascript, позволяя функциям обращаться к переменным экземпляра класса?

5 ответов


вы возитесь с С SuperClassобъект, в этой строке

SubClass.prototype = new SuperClass();

прототип ребенка должен зависеть от прототипа родителя. Итак, вы можете наследовать вот так

SubClass.prototype = Object.create(SuperClass.prototype);

кроме того, вполне нормально изменить конструктор на фактическую функцию, как это

SubClass.prototype.constructor = SubClass;

чтобы сохранить вашу реализацию generic, вы можете использовать Object.getPrototypeOf, чтобы получить Родительский прототип в цепочке наследования и тогда вызовите printInfo, такой

SubClass.prototype.printInfo = function() {
    Object.getPrototypeOf(SubClass.prototype).printInfo(this);
};

С, info определена в SubClass тем не менее, он будет печатать undefined. Вы также можете вызвать не конструктор предка, как это

var SubClass = function() {
    SuperClass.call(this);
};

Примечание: вы создаете глобальные переменные, опуская var ключевое слово перед SuperClass и SubClass.


после прочтения всех ответов, я использую следующий механизм наследования:

var SuperClass = function()
{
    this.info = "I am superclass";
    console.log("SuperClass:");
};

SuperClass.prototype.printInfo = function()
{
    console.log("printing from superclass printInfo");
    console.log("printinfo");
    console.log(this.info);
};

var SubClass = function(){
    SuperClass.call(this);
};

SubClass.prototype = Object.create(SuperClass.prototype);
SubClass.prototype.constructor = SubClass;

SubClass.prototype.printInfo = function()
{
    console.log("calling superclass");
    Object.getPrototypeOf(SubClass.prototype).printInfo.call(this);
    console.log("called superclass");
};

var sc = new SubClass();
sc.printInfo();

вы можете написать это так:

SuperClass.prototype.printInfo = function(){
  console.log("printing from superclass printInfo");
  console.log(this.info); 
};

SubClass.prototype.printInfo = function(){
  console.log("calling superclass");
  SuperClass.prototype.printInfo.call(this);
  console.log("called superclass");
};

@coolscitist

вместо

SubClass.prototype.printInfo = function()
{
    Object.getPrototypeOf(SubClass.prototype).printInfo.call(this);
};

использовать

SubClass.prototype.printInfo = function()
{
    Object.getPrototypeOf(this.constructor.prototype).printInfo.call(this);
};

для тех, кто приходит больше из мира Java, я бы проигнорировал все вышесказанное и использовал следующий синтаксис вместо того, чтобы был введен в 2015

class Polygon {
  constructor(height, width) {
    this.height = height;
    this.width = width;
  }
}

class Square extends Polygon {
  constructor(sideLength) {
    super(sideLength, sideLength);
  }
  get area() {
    return this.height * this.width;
  }
  set sideLength(newLength) {
    this.height = newLength;
    this.width = newLength;
  }
} 

подробнее о https://developer.mozilla.org/en-US/docs/Web/JavaScript/Inheritance_and_the_prototype_chain

и suddently u может использовать super в качестве ключевого слова для доступа к ancester и т. д.... Для меня это было большим облегчением