14.04.2013, 22:03
|
|
Профессор
|
|
Регистрация: 18.01.2013
Сообщений: 1,098
|
|
Сообщение от Aetae
|
Взяли и убили у человека зарождающееся понимание...))
|
вот я млять специально ни слова не говорил ни про чо такое а) а он все засрал мне
|
|
15.04.2013, 11:14
|
Новичок на форуме
|
|
Регистрация: 25.05.2012
Сообщений: 8
|
|
Почему наследования не происходит? Я проверил, скрипт не создает ошибок.
var Wall = new function(){
this.color = "red";
}
var Room = new function(){
this.size = "small";
}
Room.prototype = Wall; //объявляем, что Room наследуктся от Wall
Room.prototype.color="white"; //можно задать через Wall.color - будет то же самое.
console.log(Room.prototype.color, Wall.color); //Проверили, действительно так.
console.log(Room.color); //Undefined! Опа. Наследования не произошло.
|
|
15.04.2013, 11:54
|
Новичок на форуме
|
|
Регистрация: 25.05.2012
Сообщений: 8
|
|
А всё, у меня получилось "наследование с помощью цепочек прототипов". Только выглядит это очень грустно.
var Animal = function(){
this.prototype = new function(){//создаем базовый прототип
this.walk = true;
}
}
var Cat = function(){
this.prototype = new Animal();//наследуем от Animal
}
console.log(new Cat().walk);//не получилось
console.log(new Cat().prototype.prototype.walk); //true /A так - работает
Цепочки вида Object.prototype.prototype.prototype.prototype.pro totype.property - неудобны, потому что если убрать элемент из последовательности наследования, то придется редактировать абсолютно все вызовы.
Последний раз редактировалось father_gorry, 15.04.2013 в 11:59.
|
|
15.04.2013, 12:02
|
Интересующийся
|
|
Регистрация: 14.12.2011
Сообщений: 12
|
|
Сообщение от father_gorry
|
Почему наследования не происходит? Я проверил, скрипт не создает ошибок.
var Wall = new function(){
this.color = "red";
}
var Room = new function(){
this.size = "small";
}
Room.prototype = Wall; //объявляем, что Room наследуктся от Wall
Room.prototype.color="white"; //можно задать через Wall.color - будет то же самое.
console.log(Room.prototype.color, Wall.color); //Проверили, действительно так.
console.log(Room.color); //Undefined! Опа. Наследования не произошло.
|
Потому что код бессмысленный. Если опустить тонкости, то можно сказать, что у объектов нет прототипов, у них есть конструкторы. Прототипы устанавливаются у конструкторов. А вы у объекта Room сами создаете свойство prototype, а ничего не "объявляете". Оно к прототипам и наследованию никакого отношения не имеет, просто назвали вы его так же. То что у вас написано можно записать короче, заменив название prototype на obj например:
var Wall = {color:'red'};
var Room = {size:'small', obj: Wall}; //{size:'small', obj: {color:'red'}}
|
|
15.04.2013, 12:02
|
|
✔
|
|
Регистрация: 04.06.2012
Сообщений: 513
|
|
Сообщение от father_gorry
|
Почему наследования не происходит? Я проверил, скрипт не создает ошибок.
|
var Wall = new function(){
this.color = "red";
} // объявили функцию-конструктор и тут же вызвали её, создался объект со свойством color, присвоили переменной Wall ссылку на этот объект
var Room = new function(){
this.size = "small";
} // объявили функцию-конструктор и тут же вызвали её, создался объект со свойством size, присвоили переменной Room ссылку на этот объект
Room.prototype = Wall; /* здесь мы нифига НЕ объявляем, что Room наследуктся от Wall!
В этой строчке мы записываем в свойство prototype объекта Room ссылку на объект Wall
Ведь свойство объекта prototype - это не прототип объекта! прототип находится в скрытом свойстве [[Prototype]] объекта (в некот. браузерах прототип доступен через свойство __proto__)
*/
Room.prototype.color="white"; /* можно задать через Wall.color - будет то же самое - да, это правда)) ведь Room.prototype и Wall ссылаются на один и тот же объект
*/
console.log(Room.prototype.color, Wall.color); //Проверили, действительно так.
console.log(Room.color); /* Undefined! Опа. Наследования не произошло.
Ну и спрашивается, какого нафик наследования?
Ессессно, у Room нет свойства color, мы же его не присвоили
*/
__________________
★ ²º¹³ ☆
Последний раз редактировалось Hekumok, 15.04.2013 в 12:05.
|
|
15.04.2013, 12:06
|
Интересующийся
|
|
Регистрация: 14.12.2011
Сообщений: 12
|
|
Сообщение от father_gorry
|
А всё, у меня получилось "наследование с помощью цепочек прототипов". Только выглядит это очень грустно.
var Animal = function(){
this.prototype = new function(){//создаем базовый прототип
this.walk = true;
}
}
var Cat = function(){
this.prototype = new Animal();//наследуем от Animal
}
console.log(new Cat().walk);//не получилось
console.log(new Cat().prototype.prototype.walk); //true /A так - работает
Цепочки вида Object.prototype.prototype.prototype.prototype.pro totype.property - неудобны, потому что если убрать элемент из последовательности наследования, то придется редактировать абсолютно все вызовы.
|
Здесь вы занимаетесь тем же, чем и большинство приходящих на javascript - пишете собственное наследование, вместо того, чтобы разобраться, как оно в нем устроено. И мне интересно, если в наследовании на классах удалить кокой-нибудь промежуточный класс, то все в порядке будет?
Последний раз редактировалось Aves, 15.04.2013 в 12:09.
|
|
15.04.2013, 12:08
|
Профессор
|
|
Регистрация: 04.02.2011
Сообщений: 1,815
|
|
Пример наследование из библиотеки createJs с которой сейас работаю
//обьявляем неймспейс
this.createjs = this.createjs||{};
//наследуем
(function() {
//конструктор
var Shape = function(prop) {
//вызов функции инициализации
this.initialize(prop);
}
//наследуем от родителя
var p = Shape.prototype = new createjs.DisplayObject();
//сохраним функцию инициализации родителя, вдруг пригодится
p.DisplayObject_initialize = p.initialize;
//инициализация, по сути конструктор из классического ООП
p.initialize=function(prop){
this.x=prop.x;
this.y=prop.y;
}
// обьявляем новые методы и свойства
p.graphics = null;
p.test = function(){ hello() };
//приватный метод
function hello(){
alert('hello');
}
//записываем в неймспейс
this.createjs.Shape=Shape
})()
хочу разЪяснить один момент.(для новичков)
Главный недостаток вышеприведённого примера в том что вызывается конструктор DisplayObject при наследовании. Иногда это нужно, а иногда недопустимо.
Эта проблема легко решается.
Если вызов контструктора нужен, тогда оставляете
var p = Shape.prototype = new createjs.DisplayObject();
А если ненужен, то пишите
var p = Shape.prototype = Object.create( createjs.DisplayObject.prototype);
+ если вам вдруг понадобится вызвать конструктор родителя (иногда используется цепочка конструкторов) вы можете его вызвать через DisplayObject_initialize
вот ради этих возможностей и использован трюк с выносом кода конструктора в функцию initialize
P.S. Однако я сам использую по возможности функцию класс и я не вижу смысла боятся подобных функций.
__________________
Лучше калымить в гандурасе чем гандурасить на колыме
Последний раз редактировалось DjDiablo, 15.04.2013 в 12:52.
|
|
15.04.2013, 12:10
|
|
✔
|
|
Регистрация: 04.06.2012
Сообщений: 513
|
|
Сообщение от father_gorry
|
А всё, у меня получилось "наследование с помощью цепочек прототипов".
|
Никакого наследования у вас не получилось!
Сообщение от father_gorry
|
Только выглядит это очень грустно.
|
Да, действительно, ваш код и понимание прототипов выглядит грустно
__________________
★ ²º¹³ ☆
|
|
15.04.2013, 12:52
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Aves
|
Если опустить тонкости, то можно сказать, что у объектов нет прототипов, у них есть конструкторы. Прототипы устанавливаются у конструкторов.
|
.... здорово , а ничего что ссылка на конструктор это свойство прототипа, а не прототип свойство конструктора ?
|
|
15.04.2013, 13:09
|
х.з
|
|
Регистрация: 21.11.2010
Сообщений: 4,588
|
|
Сообщение от Aves
|
И мне интересно, если в наследовании на классах удалить кокой-нибудь промежуточный класс, то все в порядке будет?
|
Изменить прототип существующего объекта полностью ? Для этого он может и не быть промежуточным в длинной цепочке. достаточно у одного конструктора полностью сменить прототип .
А что мешает протестить самому? -это несколько строк кода всего
function A(){this.num =10};
function D(){this.num =20};
function B(){}
B.prototype = new A;
var c = new B;
alert(c.num)
B.prototype = new D;
alert(c.num)
Последний раз редактировалось dmitriymar, 15.04.2013 в 13:16.
|
|
|
|