Как установить наследование между объектами в JavaScript?

У меня есть следующий код, который создает два объекта (ProfileManager и EmployerManager), где объект EmployerManager должен наследовать от объекта ProfileManager. Однако, когда я делаю предупреждение (pm instanceof ProfileManager); он возвращает false.

function ProfileFactory(profileType) {
    switch(profileType)
    {
        case 'employer':
            return new EmployerManager();
            break;
    }
}

function ProfileManager() {
    this.headerHTML = null;
    this.contentHTML = null;
    this.importantHTML = null;

    this.controller = null;

    this.actions = new Array();
    this.anchors = new Array();
}

ProfileManager.prototype.loadData = function(action, dao_id, toggleBack) {

    var step = this.actions.indexOf(action);

    var prv_div = $('div_' + step - 1);
    var nxt_div = $('div_' + step);

    new Ajax.Request(this.controller, {
            method: 'get',
            parameters: {action : this.actions[step], dao_id : dao_id},
            onSuccess: function(data) {
                nxt_div.innerHTML = data.responseText;

                if (step != 1 && !prv_div.empty()) {
                    prv_div.SlideUp();
                }

                nxt_div.SlideDown();

                for(i = 1; i <= step; i++)
                {
                    if ($('step_anchor_' + i).innerHTML.empty())
                    {
                        $('step_anchor_' + i).innerHTML = this.anchors[i];
                    }
                }
            }
        }
    )   
}

EmployerManager.prototype.superclass = ProfileManager;

function EmployerManager() {
    this.superclass();

    this.controller = 'eprofile.php';

    this.anchors[1] = 'Industries';
    this.anchors[2] = 'Employer Profiles';
    this.anchors[3] = 'Employer Profile';

    this.actions[1] = 'index';
    this.actions[2] = 'employer_list';
    this.actions[3] = 'employer_display';   
}

var pm = new ProfileFactory('employer');
alert(pm instanceof ProfileManager);

Кстати, это моя самая первая попытка объектно-ориентированного JavaScript, поэтому, если вы чувствуете себя обязанным прокомментировать глупость моего подхода, пожалуйста, не стесняйтесь сделать это, но предложите предложения о том, как лучше подойти к проблеме.

Поведение ключевого слова "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) для оценки ваших знаний,...
1
0
318
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Я использовал что-то похожее на модель Дина Эдварда Base.js. http://dean.edwards.name/weblog/2006/03/base/

В вашем коде pm - это экземпляр EmployerManager, у которого есть суперкласс ProfileManager. Мне это кажется обратным. Разве ProfileManager не должен иметь суперкласс EmployerManager?

Насколько я понимаю, суперкласс - это родительский класс. Поскольку ProfileManager является родительским для EmployerManager, ProfileManager является суперклассом.

Noah Goodrich 21.11.2008 22:51

В результате pm instanceof EmployerManager возвращает true, а pm instanceof ProfileManager возвращает false.

Mr. Muskrat 22.11.2008 02:29

Под своим ответом я имел в виду, что ProfileManager - это определенный тип EmployerManager, следовательно, EmployerManager должен быть суперклассом.

Mr. Muskrat 22.11.2008 02:30

Прототип поддерживает (имитируя) наследование классов через функцию Object.extend ().

Однако можно утверждать, что попытка навязать наследование на основе классов языку, который не поддерживает классы, является примером того, что «когда у вас есть только молоток, весь мир выглядит как гвоздь».

По мнению экспертов, JavaScript является объектно-ориентированным, но он использует систему на основе прототипов, а не систему на основе классов.

Noah Goodrich 22.11.2008 15:49

Но спасибо за предложение относительно Object.extend. Я попробовал, но по какой-то причине не смог.

Noah Goodrich 22.11.2008 16:10

Я просто хотел сказать, что, хотя JavaScript является объектно-ориентированным языком, он не имеет многих функций, характерных для других популярных объектно-ориентированных языков. И наоборот, он также имеет множество функций, которых нет в других популярных объектно-ориентированных языках.

Как вы уже обнаружили, наследование осуществляется через объекты-прототип, а не через наследование классов. Однако при использовании оператора instanceof объект-прототип не проверяется. Это означает, что JavaScript не поддерживает полиморфизм. По крайней мере, не из коробки.

Вы можете найти библиотеки, которые заставят JavaScript соответствовать модели ООП, к которой вы привыкли; если вы находитесь под прицелом, это может быть лучшим решением. (Хотя ни одна библиотека никогда не сделает объект JavaScript полиморфным при исследовании с помощью instanceof; функция isInstanceOf, вероятно, потребуется.) Или вы можете выбрать другой язык, который соответствует этой модели ООП, но вы, вероятно, работаете в браузере, так что это явно не вариант. Или вы можете ответить на вопрос: «Как я могу решить свою проблему без полиморфизма?»

Ответ принят как подходящий

Спасибо за все комментарии. Однако решение проблемы было найдено во внесении этого изменения в объявление EmployerManager:

function EmployerManager() {

    this.controller = 'eprofile.php';
    this.anchors = new Array('Industries', 'Employer Profiles', 'Employer Profile');
    this.actions = new Array('index', 'employer_list', 'employer_display'); 
}

EmployerManager.prototype = new ProfileManager;

Очевидно, JavaScript поддерживает два разных типа наследования: на основе функций и на основе прототипов. Версия на основе функций - это то, что я изначально опубликовал, но не смог заработать, потому что EmployerManager не смог увидеть метод loadData, который был частью прототипа ProfileManager.

Этот новый пример основан на прототипе и работает сейчас. EmployerManager теперь является экземпляром ProfileManager.

Обратите внимание, что был задан тот же вопрос (мной). Посмотрите ответы на этот пост.

Вы можете использовать новый или Object.create для достижения классического наследования

function A(){
    B.call(this);
}
function B(){
}

//there are 2 ways to make instanceof works
//1. use Object.create
A.prototype = Object.create(B.prototype);
//2. use new
//A.prototype = new B();

console.info(new A() instanceof B); //true

//make instanceof works
EmployerManager.prototype = Object.create(ProfileManager.prototype);
//add other prototype memebers
EmployerManager.prototype.superclass = ProfileManager;

console.info(new EmployerManager() instanceof ProfileManager); //true

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