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

Давайте перейдем к изучению разнообразных примеров, демонстрирующих некоторые особенности dojo.declare. Первый пример снабжен обширными комментариями и демонстрирует несколько более сложный вариант наследования, показывая важные особенности использования внутреннего метода constructor функции dojo.declare:
<html>
<head>
<title>Fun with Inheritance!</title>
<script
type="text/javascript"
src="http://o.aolcdn.com/dojo/1.1/dojo/dojo.xd.js">
</script>
<script type="text/javascript">
dojo.addOnLoad(function() {
//Здесь объявляется обычный объект Function.
function Point(x,y) {}
dojo.extend(Point, {
x : 0,
y : 0,
toString : function() {return "x=",this.x," y=",this.y;}
});
dojo.declare(
"Shape",
null,
{
//Сначала необходимо определить члены класса,
//но инициализироваться они будут в функции
//constructor. Никогда не инициализируйте объект
//Function в этом ассоциативном массиве, если
//не хотите, чтобы он был доступен *всем*
//экземплярам класса, что обычно нетипично.
//В соответствии с общепринятыми соглашениями
//начальный символ подчеркивания обозначает
//"частные" члены
_color: "",
_owners: null,
//Инструментарий Dojo предусматривает для классов
//специальную функцию constructor. Это она и есть.
//Примечательно, что эта функция 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());
});
</script>
</head>
(body)
(/body)
</html>


Важный вывод, который следует из этого примера, заключается в том, что к моменту, когда dojo.declare завершит свою работу, объект Function будет существовать в памяти. Истинный объект Function будет существовать неявно, а его прототип будет содержать все, что было передано функции dojo.declare в третьем параметре. Этот объект служит прототипом для всех объектов, которые будут созданы в дальнейшем.
Теги:
Имитация классов, наследование
Добавлено: 24 Июля 2018 21:53:36 Добавил: Андрей Ковальчук Нравится 0
Добавить
Комментарии:
Нету комментариев для вывода...