Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 14.04.2013, 14:57
Новичок на форуме
Отправить личное сообщение для father_gorry Посмотреть профиль Найти все сообщения от father_gorry
 
Регистрация: 25.05.2012
Сообщений: 8

Есть ли разумное объяснение столь чрезмерной сложности наследования в js?
function Wall(){
	this.color = "red";
}
function Room(){
	this.size = "small";
}
//а теперь я хочу "просто унаследовать объект от объекта", как написано в руководстве.
Room.prototype = Wall;
console.log("Room color", Room.color); //ждем, что будет red, однако оказывается undefined
//Оказывается, нужно поступить намного сложнее
Room.prototype = new Wall(); //Сначала создать экземпляр родителя и связать его с потомком
var room1 = new Room(); //Затем - экземпляр потомка
console.log("room1 color", room1.color); //red. И только теперь оно заработало.


Вывод: нельзя наследовать функцию от функции, можно только экземпляр от функции через другой экземпляр.
Почему сделано так сложно? Неужели авторы языка, когда писали спецификацию, не увидели этого?
Ответить с цитированием
  #2 (permalink)  
Старый 14.04.2013, 15:08
х.з
Посмотреть профиль Найти все сообщения от dmitriymar
 
Регистрация: 21.11.2010
Сообщений: 4,588

Сообщение от father_gorry
нельзя наследовать функцию от функции, можно только экземпляр от функции через другой экземпляр.
чего?
какой экземпрляр? чего экземпляр?
Сообщение от father_gorry
new Wall(); //Сначала создать экземпляр родителя и связать его с потомком
чего ? вобщето это создаётся объект с помощью конструктора Wall и затем "устанавливается прототип" Room

Сообщение от father_gorry
//а теперь я хочу "просто унаследовать объект от объекта", как написано в руководстве.
Room.prototype = Wall;
какого объекта? Wall -это функция.

Сообщение от father_gorry
console.log("Room color", Room.color); //ждем, что будет red, однако оказывается undefined
//Оказывается, нужно поступить намного сложнее
с чего такие ожидания? Room это функция, разве создавалось и инициировалось её свойство color?

во загнул
Сообщение от father_gorry
Неужели авторы языка, когда писали спецификацию, не увидели этого?
. Хорошо что вы, не один из авторов

А разумное объяснение есть -вы вобще не знаете основ.
изучите основы для начала
Сообщение от father_gorry
нельзя наследовать функцию от функции
и смысл сего действа? ни разу не слышал о наследовании функции от функции

Последний раз редактировалось dmitriymar, 14.04.2013 в 15:30.
Ответить с цитированием
  #3 (permalink)  
Старый 14.04.2013, 15:44
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Есть, дело в том что яваскрипт был расчитан на написание прогармм в 100 строчек кода максимум так что с ООП они особо не заморачивались..

Ответить с цитированием
  #4 (permalink)  
Старый 14.04.2013, 17:01
Новичок на форуме
Отправить личное сообщение для father_gorry Посмотреть профиль Найти все сообщения от father_gorry
 
Регистрация: 25.05.2012
Сообщений: 8

О, я бы с удовольствием изучил основы, чем собственно и занимаюсь. И это вызывает лютую боль между полуплечий. Сейчас задача - понять, как удобно реализуется ООП в JS.

Нельзя наследовать функции? Хорошо, буду наследовать объекты.

var Wall = new function(){
	this.color = "red";
}
var Room = new function(){
	this.size = "small";
}
Room.prototype = Wall; 
console.log(Room.color); //undefined, хотя по логике должен присутствовать
//попробуем самым прямым и логичным способом
Room.prototype.color="white";
console.log(Room.prototype.color, Wall.color);//white, white.

Отлично, теперь я умею легко управлять свойствами предка из потомка. Но зачем???

Последний раз редактировалось father_gorry, 14.04.2013 в 17:11.
Ответить с цитированием
  #5 (permalink)  
Старый 14.04.2013, 17:31
Интересующийся
Отправить личное сообщение для Aves Посмотреть профиль Найти все сообщения от Aves
 
Регистрация: 14.12.2011
Сообщений: 12

Я далеко не специалист в ООП, и классическое наследование большинства ЯП приводит меня в уныние. А вам оно похоже нравится, потому что вы пытаетесь его отыскать там, где его нет. Вроде как только в ES6 появится обертка над прототипным наследованием, похожая на классическое.

В прототипном вроде есть тонкости и детали, но лично мне кажется, что главное понять то, что все объекты создаются функциями на основании прописанного в функции объекта-прототипа. И всё.
Взяли любую функцию, прописали ей прототип, вызвали с new, получили объект с нужной цепочкой прототипов, и соответственно нужными методами и свойствами.
function f(){}
f.prototype = new String();
s = new f();
typeof s.toLowerCase // 'function'
f.prototype.myTest = 'qwerty';
s.myTest; // 'qwerty'

То есть прототипы ставить нужно у функции-конструктора, а не у созданного объекта.
Ответить с цитированием
  #6 (permalink)  
Старый 14.04.2013, 18:17
Аватар для SkyLight
Злюка-бобер
Отправить личное сообщение для SkyLight Посмотреть профиль Найти все сообщения от SkyLight
 
Регистрация: 21.03.2010
Сообщений: 438

Сообщение от father_gorry
console.log(Room.color); //undefined, хотя по логике должен присутствовать
Это с какой такой стати оно должно присутствовать? Вы просто не понимаете разницу между свойствами "класса" и свойствами экземпляра. Это две разные вещи.
Сообщение от father_gorry
Сейчас задача - понять, как удобно реализуется ООП в JS
1. В большинстве задач ООП в таком ключе не требуется. 2. Если все-таки надо, то есть много статей. описывающих всего несколько вполне себе устоявшихся паттернов в JS. И то, что вы их не понимаете, не значит, что они кривые/неправильные.
__________________
In WEB We Trust
У всех есть своя темная сторона...
Ответить с цитированием
  #7 (permalink)  
Старый 14.04.2013, 19:15
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Сообщение от father_gorry
Нельзя наследовать функции? Хорошо, буду наследовать объекты.
именно, тут ПРОТОТИПНОЕ наследование..

ты создаешь класс (функцию), и задаешь для неё ПРОТОТИП, ЭТАЛОН так сказать, от которого будут все наследовать если различия не указаны явно.


function Animal(){
   this.animal = true;
}

function Cat(){
  this.cat = true;
}

Cat.prototype = new Animal; // Укажем, что эталоном для Котов будет Животное (создадим его в специальное свойство конструктора котов, таким образом все созданные этим конструктором коты будут ровняться на это животное и стараться быть похожими на него ([B]даже если оно видоизменится кстати[/B]) )

new Cat().animal // true
new Cat().cat // true



тадаааа


терь покажу какой в этом прикол

function Animal(){
   this.animal = true;
}

function Cat(){
  this.cat = true;
}

Cat.prototype = new Animal; 

new Cat().ololo // unefined   - НИ У КОТОВ НИ У ЖИВОТНЫХ НЕТ ТАКОГО СВОЙСТВА 

// что ж все коты будут походить на то эталонное животное которое мы создали в свойство prototype конструктора говорите? хм..

  // ну хорошо, тут щас лежит животное, эталон, так сказать для котов,  добавлю ка я ему свойство. проверим появится ли оно у котов?
Cat.prototype.ololololololo = 11;
new Cat().ololololololo //11


// хм прикольно, а что если я уже создал 900000 котов, и ТОЛЬКО ПОСЛЕ ЭТОГО добавил в в их прототип новое свойство.. появится ли оно У УЖЕ СОЗДАННЫХ ДДООО этого котов?

Последний раз редактировалось megaupload, 14.04.2013 в 19:25.
Ответить с цитированием
  #8 (permalink)  
Старый 14.04.2013, 19:27
Аватар для megaupload
Профессор
Отправить личное сообщение для megaupload Посмотреть профиль Найти все сообщения от megaupload
 
Регистрация: 18.01.2013
Сообщений: 1,098

Если да, то это означает что мы можем добавить в прототип например Массивов какой нить метод который автоматически появятся у всех уже созданных до этого массивов и это будет охуенно.

Напрмиер
Array.prototype.ololo = function(){}
Ответить с цитированием
  #9 (permalink)  
Старый 14.04.2013, 19:27
Профессор
Отправить личное сообщение для tenshi Посмотреть профиль Найти все сообщения от tenshi
 
Регистрация: 20.03.2008
Сообщений: 1,183

Не забываем вызывать конструктор предка

function Wall(){
	this.color = "red";
}
function Room(){
        Wall.apply(this, arguments)
	this.size = "small";
}
console.log("Room color", Room.color);
__________________
.ня
Ответить с цитированием
  #10 (permalink)  
Старый 14.04.2013, 20:52
Аватар для Aetae
Тлен
Отправить личное сообщение для Aetae Посмотреть профиль Найти все сообщения от Aetae
 
Регистрация: 02.01.2010
Сообщений: 6,105

Сообщение от tenshi Посмотреть сообщение
Не забываем вызывать конструктор предка

function Wall(){
	this.color = "red";
}
function Room(){
        Wall.apply(this, arguments)
	this.size = "small";
}
console.log("Room color", Room.color);
Взяли и убили у человека зарождающееся понимание...))
__________________
29375, 35
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
есть ли в js понятие частоты кадров, наподобие как во флэше? andrew_F Общие вопросы Javascript 8 01.05.2012 19:25
глюк форума Gvozd Сайт Javascript.ru 11 18.03.2009 13:37