У меня есть следующий код, который создает два объекта (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, поэтому, если вы чувствуете себя обязанным прокомментировать глупость моего подхода, пожалуйста, не стесняйтесь сделать это, но предложите предложения о том, как лучше подойти к проблеме.



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


Я использовал что-то похожее на модель Дина Эдварда Base.js. http://dean.edwards.name/weblog/2006/03/base/
В вашем коде pm - это экземпляр EmployerManager, у которого есть суперкласс ProfileManager. Мне это кажется обратным. Разве ProfileManager не должен иметь суперкласс EmployerManager?
В результате pm instanceof EmployerManager возвращает true, а pm instanceof ProfileManager возвращает false.
Под своим ответом я имел в виду, что ProfileManager - это определенный тип EmployerManager, следовательно, EmployerManager должен быть суперклассом.
Прототип поддерживает (имитируя) наследование классов через функцию Object.extend ().
Однако можно утверждать, что попытка навязать наследование на основе классов языку, который не поддерживает классы, является примером того, что «когда у вас есть только молоток, весь мир выглядит как гвоздь».
По мнению экспертов, JavaScript является объектно-ориентированным, но он использует систему на основе прототипов, а не систему на основе классов.
Но спасибо за предложение относительно Object.extend. Я попробовал, но по какой-то причине не смог.
Я просто хотел сказать, что, хотя 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
Насколько я понимаю, суперкласс - это родительский класс. Поскольку ProfileManager является родительским для EmployerManager, ProfileManager является суперклассом.