Наследование (Prototype)

В javascript наследование реализовано с помощью прототипов, а точнее цепочки прототипов. Прототип - это резервное хранилище свойств и методов. Каждый объект содержит ссылку на свой объект-прототип.

 var animal = {
  eats: true
};
var rabbit = {
  jumps: true
};

rabbit.__proto__ = animal;

obj.__proto__ //тоже самое что и obj.[[Prototype]]

При попытке получить доступ к какому-либо свойству объекта, в начале свойство ищется в самом объекте, если не находится - ищется в объекте-прототипе, потом в прототипе прототипа и т.д. Поиск ведется до тех пор пока не будет найдено свойство с совпадающем именем или не будет достигнут конец цепочки прототипов.

Чтобы создать объект который не будет иметь прототипа:

 var obj = Object.create(null)

Для организации прототипного наследования:

 function Animal(){}

 function Rabbit(){}

 Rabbit.prototype = Object.create(Animal.prototype); //прототипное наследование
 Rabbit.prototype.constructor = Rabbit //эту фразу обязательно необходимо добавить, т.к. верх строка затипает конструктор

!!! Прототипом должен быть обязательно объект, тесть следующий код не будет оказавыть ни какого влияния

 Rabbit.prototype = 1;

Мы можем создать свою собственную реализацию Object.create:

 function inherit(proto){
  function F(){};
  F.prototype = proto;
  var obj = new F();
  return obj;
 }

В javascript существуют встроенные классы: встроенные классы

Функциональный стиль создания класса:

 function Animal(){
  this.name = 'animal';
  this.run = function(speed){
   //to do something
   };
 };

 var a = new Animal();

Класс через прототип:

 function Animal(){
  this.name = 'animal';
 };

 Animal.prototype.run = function(speed){
  // to do something
  };

instanceOf

instanceOf помогает проверить какому классу принадлежит объект, с учетом прототипного наследования.

Алгоритм проверки obj instanceOf MyClass:

  • получить obj.proto
  • сравнить obj.proto c MyClass.prototype
  • если не совпадают, тогда заменить obj на obj.proto и повторить сравнение

Данный алгоритм может привести к забавному случаю:

function Rabbit(){}
var rabbit = new Rabbit();

Rabbit.prototype = {};

alert(rabbit instanceOf Rabbit) // false

Задачи на прототипы (в конце статей):

Материал взят из

results matching ""

    No results matching ""