Наследование (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
Задачи на прототипы (в конце статей):
Материал взят из