Правильный способ вызова функций суперкласса из подкласса
у меня есть " суперкласс "с" 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 и т. д.... Для меня это было большим облегчением