Передать параметр в подкласс Javascript

Проблема, которую я решаю, заключается в передаче параметра конструктору подкласса объекта.

Этот код, в котором функция не принимает параметров, работает. Он включает в себя два сценария, один из которых создает экземпляр 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())

Рассматривали ли вы возможность использования синтаксиса класса ES6?

Bergi 20.01.2019 20:39

Нет. Я использовал подобный синтаксис на протяжении десятилетий, и мне нравится этот прототип в качестве изменения.

Len White 20.01.2019 20:43

Синтаксис class по-прежнему содержит элементы прототипа, он просто синтаксически предотвращает неправильное наследование…

Bergi 20.01.2019 20:45
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
2
3
530
1

Ответы 1

Вот как вы можете добиться наследования. Способ передачи значений вверх по цепочке прототипов заключается в вызове функций родительского конструктора и распространении аргументов.

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()

Фантастика, спасибо, это работает и даже имеет синтаксический смысл!

Len White 20.01.2019 20:36

Другие вопросы по теме