|
Есть ли разумное объяснение столь чрезмерной сложности наследования в 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. И только теперь оно заработало. Вывод: нельзя наследовать функцию от функции, можно только экземпляр от функции через другой экземпляр. Почему сделано так сложно? Неужели авторы языка, когда писали спецификацию, не увидели этого? |
Цитата:
какой экземпрляр? чего экземпляр? Цитата:
Цитата:
Цитата:
во загнул Цитата:
А разумное объяснение есть -вы вобще не знаете основ. изучите основы для начала Цитата:
|
Есть, дело в том что яваскрипт был расчитан на написание прогармм в 100 строчек кода максимум так что с ООП они особо не заморачивались..
![]() |
О, я бы с удовольствием изучил основы, чем собственно и занимаюсь. И это вызывает лютую боль между полуплечий. Сейчас задача - понять, как удобно реализуется ООП в 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. Отлично, теперь я умею легко управлять свойствами предка из потомка. Но зачем??? |
Я далеко не специалист в ООП, и классическое наследование большинства ЯП приводит меня в уныние. А вам оно похоже нравится, потому что вы пытаетесь его отыскать там, где его нет. Вроде как только в ES6 появится обертка над прототипным наследованием, похожая на классическое.
В прототипном вроде есть тонкости и детали, но лично мне кажется, что главное понять то, что все объекты создаются функциями на основании прописанного в функции объекта-прототипа. И всё. Взяли любую функцию, прописали ей прототип, вызвали с new, получили объект с нужной цепочкой прототипов, и соответственно нужными методами и свойствами. function f(){} f.prototype = new String(); s = new f(); typeof s.toLowerCase // 'function' f.prototype.myTest = 'qwerty'; s.myTest; // 'qwerty' То есть прототипы ставить нужно у функции-конструктора, а не у созданного объекта. |
Цитата:
Цитата:
|
Цитата:
ты создаешь класс (функцию), и задаешь для неё ПРОТОТИП, ЭТАЛОН так сказать, от которого будут все наследовать если различия не указаны явно. 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 котов, и ТОЛЬКО ПОСЛЕ ЭТОГО добавил в в их прототип новое свойство.. появится ли оно У УЖЕ СОЗДАННЫХ ДДООО этого котов? |
Если да, то это означает что мы можем добавить в прототип например Массивов какой нить метод который автоматически появятся у всех уже созданных до этого массивов и это будет охуенно.
Напрмиер Array.prototype.ololo = function(){} |
Не забываем вызывать конструктор предка
function Wall(){ this.color = "red"; } function Room(){ Wall.apply(this, arguments) this.size = "small"; } console.log("Room color", Room.color); |
Цитата:
|
Часовой пояс GMT +3, время: 06:43. |
|