JavaScript ES6 классы: Полиморфизм | ReactJS

JavaScript ES6 классы: Полиморфизм | ReactJS

Полиморфизм проще всего постичь на примере встроенных конструкторов (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

Поделись знаниями: