Полиморфизм проще всего постичь на примере встроенных конструкторов (String
,Array
,Object
…). Вот если вас спросят: “Чем число42
отличается от массива[4, 2]
и что у них общего?”, чтобы вы ответили? Наверняка, вы были начали рассказывать про примитивы и объекты, чем они отличаются, что можно делать с теми и другими, на вопрос про отличия. Но чем они похожи друг на друга? Абсолютно разные же типы данных! Но, очевидно, что они разделяют определённую часть методов, например, методtoString
, унаследованный отObject
. Это уже полиморфизм? Ещё нет, но мы уже близко. МетодtoString
можно весьма успешно переназначить, во-первых, в прототипе функции конструктора, и, во-вторых, сразу же для данного конкретного объекта.
Онлайн курс по React JS в Днепре
// Наш собственный конструктор
var Person = function(name) {
this.name = name;
};
// Переназначение метода toString для всех объектов,
// созданных с помощью данного конструктора
Person.prototype.toString = function() {
return 'Person ' + this.name;
};
var john = new Person('John');
// Два массива, второй абсолютно обычный,
// для первого переназначен метод toString
var arr1 = [4, 2];
var arr2 = [5, 3];
arr1.toString = function() {
return 'Array ' + this.reduce(function(result, item) {
return result + '' + item;
});
};
// В итоге
console.log(john.toString()); // Person John
console.log(arr1.toString()); // Array 42
console.log(arr2.toString()); // 5,3
Что происходит? При использовании методаtoString
на каждом из объектов происходит проверка того, какой метод нужно выбрать. Проверка ведётся следующим образом: изначально проверяется существует ли нужное свойство на самом объекте, если существует, то используется именно оно, если же нет, то проверка продолжается — на наличие свойства проверяется прототип, потом прототип прототипа, потом прототип прототипа прототипа… и так, пока не дойдём до самого конца —null
(null является прототипом дляObject
). Таким образом, полиморфизм отвечает за то, чей метод вызвать. Подробнее о том, как это всё работает в других языках программирования можно узнать вэтом вопросена Тостере, а более подробный пример с JavaScript можно посмотреть встатье про прототипы.
Большой вывод, который я хочу, чтобы вы сделали из всего вышеперечисленного: “Javascript не такой, как остальные языки программирования с классическим пониманием ООП”. Не стоит жить в стране предрассудков и пытаться перенести своё понимание ООП из другого языка — вы только потеряете время.
Теперь, когда мы во всём разобрались и сделали нужный вывод (“JavaScript другой”) можно перейти к рассмотрению “классов” в JavaScript. Источник
Онлайн курс по React JS в Днепре | Frontend, обучение, уроки, ментор - ReactWarriors