splincodewd
@splincodewd
Developer

Что не так с наследованием?

Вроде взял функцию Крокфорда, но может не уяснил саму суть, что не так в этом коде:
function extend(child, parent) {
    var emptyCtor = function() {};
    emptyCtor.prototype = parent.prototype;
    child.prototype = new emptyCtor;
    child._super = parent;
    return child;
};

var ParentClass = function() {
	this.a = 1;
};

var ChildClass = function() {};

ChildClass = extend(ChildClass, ParentClass);

var ch = new ChildClass;

document.body.innerHTML = ch.a; // undefined
  • Вопрос задан
  • 238 просмотров
Решения вопроса 1
child.prototype копирует классы из объекта-прототипа parent
Поэтому надо записывать свойства в прототип классу ParentClass
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
splincodewd
@splincodewd Автор вопроса
Developer
function extend(child, parent) {
    var emptyCtor = function() {};
    emptyCtor.prototype = parent.prototype;
    child.prototype.constructor = child;
    child._super = parent.prototype; // fix
    return child;
};

var ParentClass = function() {
	this.a = 1;
};

var ChildClass = extend(function() {
	ChildClass._super.constructor.call(this) // call parent
  this.b = 2; // add new property
}, ParentClass);

var myObject = new ChildClass;

document.body.innerHTML = myObject.a + "<br>";   // 1
document.body.innerHTML += myObject.b + "<br>"; // 2


ES6
// наследование классов
// JavaScript был и остаётся 
// прототипно-ориентированным языком

class ParentClass {
  constructor() {                      // --------------
    this.a = 1                         //              |
  };                                   //              |
}                                      //              |
                                       //              |
class ChildClass extends ParentClass { //              |
  constructor() {                      //              |
    super(); // отнаследовали конструктор     <----
    this.b = 2; // add new property
  };
}

var myObject = new ChildClass();
document.body.innerHTML = myObject.a + "<br>";
document.body.innerHTML += myObject.b + "<br>";
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы