Цитата:
|
Почему наследования не происходит? Я проверил, скрипт не создает ошибок.
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! Опа. Наследования не произошло.
|
А всё, у меня получилось "наследование с помощью цепочек прототипов". Только выглядит это очень грустно.
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 - неудобны, потому что если убрать элемент из последовательности наследования, то придется редактировать абсолютно все вызовы. |
Цитата:
var Wall = {color:'red'};
var Room = {size:'small', obj: Wall}; //{size:'small', obj: {color:'red'}}
|
Цитата:
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, мы же его не присвоили
*/
|
Цитата:
|
Пример наследование из библиотеки 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. Однако я сам использую по возможности функцию класс и я не вижу смысла боятся подобных функций. |
Цитата:
Цитата:
|
Цитата:
|
Цитата:
А что мешает протестить самому? -это несколько строк кода всего
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)
|
| Часовой пояс GMT +3, время: 06:46. |