Цитата:
|
Почему наследования не происходит? Я проверил, скрипт не создает ошибок.
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, время: 03:08. |