Пример простого наследования

Давайте перейдем к изучению разнообразных примеров, демонстрирующих некоторые особенности dojo.declare. Первый пример снабжен обширными комментариями и демонстрирует несколько более сложный вариант наследования, показывая важные особенности использования внутреннего метода constructor функции dojo.declare:


Fun with Inheritance!
type="text/javascript"
src="http://o.aolcdn.com/dojo/1.1/dojo/dojo.xd.js">

Это она и есть.
//Примечательно, что эта функция constructor
//будет вызываться с теми же аргументами,
//которые будут переданы функции constructor
//класса Circle, даже при том, что конструктор
//суперкласса нигде напрямую не вызывается.
constructor: function(color)
{
this._color = color;
this._owners = [0]; //Об инициализации объектов
//говорится в комментарии выше
console.log("Created a shape with color",
this._color, "owned by", this._owners);
},
getColor : function() {return this._color;},
addOwner : function(oid) {this._owners.push(oid);},
getOwners : function() {return this._owners;}
//Не оставляйте завершающую запятую после
//последнего элемента. Не все броузеры прощают
//эту ошибку (или выводят достаточно осмысленное
//сообщение об ошибке). Сделайте татуировку
//с этим замечанием на тыльной стороне кистей рук.
}
);
//Важное соглашение:
//В случае простого наследования сначала следует список
//аргументов конструктора суперкласса, за ними следуют
//аргументы, характерные для подкласса.
//Конструктор подкласса вызывается с полным набором
//аргументов, поэтому при правильном определении
//аргументов и если вы преднамеренно не манипулируете
//аргументами суперкласса в конструкторе подкласса,
//все будет работать безошибочно.
//Запомните: первый аргумент функции dojo.declare –
//строка, второй – объект Function.
dojo.declare(
"Circle",
Shape,
{
_radius: 0,
_area: 0,
_point: null,
constructor : function(color,x,y,radius)
{
this._radius = radius;
this._point = new Point(x,y);
this._area = Math.PI*radius*radius;
//Обратите внимание, что унаследованный член
//_color уже определен и готов к использованию!
console.log("Circle's inherited color is " +
this._color);
},
getArea: function() {return this._area;},
getCenter : function() {return this._point;}
}
);
console.log(Circle.prototype);
console.log("Circle 1, coming up...");
c1 = new Circle("red", 1,1,100);
console.log(c1.getCenter());
console.log(c1.getArea());
console.log(c1.getOwners());
c1.addOwner(23);
console.log(c1.getOwners());
console.log("Circle 2, coming up...");
c2 = new Circle("yellow", 10,10,20);
console.log(c2.getCenter());
console.log(c2.getArea());
console.log(c2.getOwners());
});


(body)
(/body)


Важный вывод, который следует из этого примера, заключается в том, что к моменту, когда dojo.declare завершит свою работу, объект Function будет существовать в памяти.


Истинный объект Function будет существовать неявно, а его прототип будет содержать все, что было передано функции dojo.declare в третьем параметре. Этот объект служит прототипом для всех объектов, которые будут созданы в дальнейшем..



Оцените статью: (0 голосов)
0 5 0

Статьи из раздела Dojo на эту тему:
JavaScript – это не Java
Вызов унаследованных методов
Имитация классов с использованием средств Dojo
Множественное наследование посредством смешивания классов
Наследование в JavaScript