Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 07.05.2018, 13:25
Интересующийся
Отправить личное сообщение для victornalchik Посмотреть профиль Найти все сообщения от victornalchik
 
Регистрация: 18.11.2017
Сообщений: 14

Прототипное наследование, переопределение метода родителя
Подскажите пожалуйста, имеются два конструктора, в прототипах которых определены методы calc. Вопрос заключается вот в чем: в прототипном методе calc (ClassB.prototype.calc) для переопределения метода вызывается метод родителя calc (ClassA.prototype.calc.apply(this)), как можно вызвать этот метод не зная имени родителя?

function ClassA(a, b) {
  this.a = a;
  this.b = b;
  this.c = 1;
  return this.a + this.b + this.c;
}

ClassA.prototype.calc = function() {
  return this.a + this.b + this.c;
}

let class1 = new ClassA(2, 2);

function ClassB(d, f) {
  this.d = d;
  this.e = f;
  this.f = 10;
  ClassA.apply(this, arguments);
}

ClassB.prototype = Object.create(ClassA.prototype);
ClassB.prototype.constructor = ClassB;

ClassB.prototype.calc = function() {
  var jas = ClassA.prototype.calc.apply(this);
  return jas + this.d + this.e + this.f;
}

let class2 = new ClassB(20, 20);

console.log(class1.calc());
console.log(class2.calc());
Ответить с цитированием
  #2 (permalink)  
Старый 07.05.2018, 14:43
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 322

В 25 строке поменяйте на...
var jas = this.__proto__.__proto__.calc.apply(this);
Ответить с цитированием
  #3 (permalink)  
Старый 07.05.2018, 14:51
Аватар для Malleys
Профессор
Отправить личное сообщение для Malleys Посмотреть профиль Найти все сообщения от Malleys
 
Регистрация: 20.12.2009
Сообщений: 322

Лучше для этого использовать ключевое слово super, но оно работает только внутри специального синтаксиса для класса

class ClassA {
	constructor(a, b) {
		this.a = a;
		this.b = b;
		this.c = 1;
		return this.a + this.b + this.c;
	}

	calc() {
		return this.a + this.b + this.c;
	}
}

let class1 = new ClassA(2, 2);

class ClassB extends ClassA {
	constructor(d, f) {
		super(...arguments);
		this.d = d;
		this.e = f;
		this.f = 10;
	}

	calc() {
		var jas = super.calc();
		return jas + this.d + this.e + this.f;
	}
}

let class2 = new ClassB(20, 20);

console.log(class1.calc());
console.log(class2.calc());
Ответить с цитированием
  #4 (permalink)  
Старый 17.05.2018, 01:45
Профессор
Отправить личное сообщение для Rise Посмотреть профиль Найти все сообщения от Rise
 
Регистрация: 07.11.2013
Сообщений: 4,011

Можно префикс одинаковый делать
function superize(Child, prefix) {
    var p1 = Child.prototype, p2 = p1.__proto__;
    if (p2) {
        p1[prefix + 'constructor'] = p2.constructor;
        for (var p in p2) {
            if (p1.hasOwnProperty(p) && typeof p2[p] == 'function') {
                p1[prefix + p] = p2[p];
            }
        }
    }
}

function ClassA() {}
ClassA.prototype.calc = function () {};

function ClassB() {
    this.ClassA_constructor();
}
ClassB.prototype = Object.create(ClassA.prototype);
ClassB.prototype.constructor = ClassB;
ClassB.prototype.calc = function () {
    this.ClassA_calc();
};
superize(ClassB, 'ClassA_');

console.log(new ClassB);
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
ООП наследование. Как получить доступ к методам родителя? ShuggyBumblebee Общие вопросы Javascript 5 03.12.2013 22:44
Можно ли в жс получить родителя метода? grifangel Общие вопросы Javascript 5 26.10.2013 11:40
Прототипное наследование не распространяется на вложенные свойства? novikov Общие вопросы Javascript 4 19.11.2012 12:31
Наследование класса-замыкания и вызов метода предка BobiKK Общие вопросы Javascript 2 21.03.2010 12:26
Переопределение метода базового класса walash jQuery 18 15.07.2009 16:05