Проблема, которую я решаю, заключается в передаче параметра конструктору подкласса объекта.
Этот код, в котором функция не принимает параметров, работает. Он включает в себя два сценария, один из которых создает экземпляр MyClass, а другой — экземпляр MySubClass:
<input type = "button" value = "Scenario 1" onclick = "Scenario1()" />
<input type = "button" value = "Scenario 2" onclick = "Scenario2()" />
function MyClass() {
this.value = "test";
}
MyClass.prototype.function = function(){
alert(this.value);
}
function MySubClass() {
}
MySubClass.prototype = new MyClass();
function Scenario1() {
var myClass = new MyClass();
myClass.function();
}
function Scenario2() {
var mySubClass = new MySubClass();
mySubClass.function();
}
Нажатие любой кнопки приводит к появлению окна предупреждения с надписью «тест».
Теперь я хочу, чтобы функция MyClass принимала параметр. Это отлично работает для экземпляра, который напрямую создает MyClass. Но экземпляр MySubClass не работает. Это концептуально то, что я хочу:
function MyClass(val) {
this.value = val;
}
MyClass.prototype.function = function(){
alert(this.value);
}
function MySubClass(val) {
}
MySubClass.prototype = new MyClass();
function Scenario1() {
var myClass = new MyClass("scenario 1");
myClass.function();
}
function Scenario2() {
var mySubClass = new MySubClass("scenario 2");
mySubClass.function();
}
Сценарий 1 отображает «сценарий 1», как и ожидалось. В Сценарии 2 элемент "value" никогда не устанавливается. Очевидно, из моего синтаксиса это будет так.
Есть ли синтаксис, который достигает того, что мне нужно? Обратите внимание, что ограничение любого решения заключается в том, что «функция» должна быть добавлена к прототипу MyClass, а не определена как внутренняя функция (например, this.function=function())
Нет. Я использовал подобный синтаксис на протяжении десятилетий, и мне нравится этот прототип в качестве изменения.
Синтаксис class по-прежнему содержит элементы прототипа, он просто синтаксически предотвращает неправильное наследование…



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Вот как вы можете добиться наследования. Способ передачи значений вверх по цепочке прототипов заключается в вызове функций родительского конструктора и распространении аргументов.
function Parent(x) {
this.x = x;
}
Parent.prototype.showX = function() {
console.info(this.x);
}
function Child(x) {
Parent.call(this, x); // call the parent constructor
}
Child.prototype = Object.create(Parent.prototype);
new Child('example').showX()Фантастика, спасибо, это работает и даже имеет синтаксический смысл!
Рассматривали ли вы возможность использования синтаксиса класса ES6?