super(text);
в вашем конструкторе Link
вызывает constructor
класса Paragraph
. Создается новый экземпляр Paragraph
, но вместо возврата экземпляра возвращается значение из метода createParagraph()
.
Поэтому JavaScript пытается создать расширенный класс на основе значение отличается от того, что он ожидает, а затем не удается. Но помните, что JavaScript классы на самом деле не классы, а слой абстракции при создании функций с прототипами.
Но, как ни странно, перестройка его с помощью регулярных объявлений функций (старый способ skool) действительно позволяет работать. Я озадачен этим.
function Paragraph(text) {
this.text = text;
return this.createParagraph();
}
Paragraph.prototype.createParagraph = function() {
var paragraph = document.createElement('p');
paragraph.appendChild(document.createTextNode(this.text));
return paragraph;
}
function Link(text, link) {
Paragraph.call(this, text);
this.link = link;
return this.createLink();
}
Link.prototype = Object.create(Paragraph.prototype);
Link.prototype.constructor = Link;
Link.prototype.createLink = function() {
var aLink = document.createElement('a');
aLink.appendChild(document.createTextNode(this.text));
aLink.href = this.link;
return aLink;
}
var link = new Link('hello', 'http://google.com');
console.log(link);
Хотя то, как вы используете class
, не имеет никакого смысла. Почему бы не поместить все просто в function
, если вы хотите только вернуть значение, но не экземпляр.
В приведенном ниже примере будет гораздо больше смысла построить то, что вы сейчас пытаетесь.
function createParagraph(text) {
var paragraph = document.createElement('p');
paragraph.appendChild(document.createTextNode(text));
return paragraph;
}
function createLink(text, link) {
var aLink = document.createElement('a');
aLink.appendChild(document.createTextNode(text));
aLink.href = link;
return aLink;
}