Прототипируемое наследование в Javascript

16-01-2013

Как такового наследования в Javscriptе не предусмотрено. Но ее можно реализовать самому, разными способами. Одним из наиболее простых и эффективных способов является реализация через прототипы объектов.

В прототипируемых языках, объекты наследуются от объектов. Однако, в Javascript не хватает оператора который выполняет эту операцию. Вместо этого есть оператор new:

 new f() 

он создает новый объект, который наследует

 f.prototype 

Этот, скажем так костыль, был введен для того чтобы язык казался более знакомым классическим программистам, но это не удалось т.к. мы можем наблюдать какого низкого мнения Java программисты о Javascript’e. В Javascript’е также нет конструктора объектов. Это мешает правильной прототипируемости в Javascript. В результате чего существует очень мало программистов знающих как можно эффективнее использовать язык.

К счастью, легко можно создать оператор который реализует истинное прототипируемое наследование:

function object(o)
{
	function F(){}
	F.prototype = o;
	return new F();
}

Функция object решает эту проблему. Он берет старый объект как параметр и возвращает новый пустой объект который наследует старый объект. Объекты которые наследуют объекты. Что может быть более объектно ориентированным!?

Итак, вместо классов, создаете прототипируемые объекты. И затем функцией object создаете новые экземпляры. Объекты в Javascript’е можно менять, добавляя новые поля и методы. И затем использовать как прототипы для новых объектов. Не обязательно иметь классы для создания кучи одинаковых объектов.

Для удобства можно написать функцию которая будет запускать функцию object вместо нас. С помощью такой функции можно реализовать привилегирование. В этом направлении можно придумать очень много интересных вещей.

Валентин Доля7.24.2013 12:07
В javascript наследование немного отличается от стандартного ООП, да оно основано на прототипах. Если кратко то так: есть функция-конструктор Person function Person (name_p,family_p) { this.name=name_p; // свойство name this.family=family_p; // свойство family } создаем объект с помощью Person var p1=new Person("Vladik","Ivanov") теперь создадим объект наследник от p1, для этого создадим новую функцию конструктор Person_debt function Person_debt (date_debt, amount_debt) { this.date=date_debt; // свойство "дата взятия долга" this.amount=amount_debt; // свойство "сумма долга" } САМОЕ ВАЖНОЕ, укажем что прототип для данной функции-конструктора будет p1, т.е. все объекты от Person_debt будут наследниками p1 Person_debt.prototype=p1; И создаем два объекта наследника var p_debt=new Person_debt("01.01.2013","30 000rub"); var p_debt2=new Person_debt("01.01.2013","30 000rub"); Они унаследует свойства родителя p1. Понятно разъяснено здесь по поповоду наследования http://s-engineer.ru/category/struktura-i-sintaksis-javascript/
ОСТАВИТЬ КОММЕНТАРИЙ