JavaScript

Yaradılma

Yaradılma

Bəzən JavaScript-in tərkibində olan Class-ların (siniflərin) imkanları məsələlərin həlli üçün kifayət etmir. Bu zaman istifadəçi öz class-larını yaradır.
İstifadəçi class-ını yaratmaq üçün nə etmək lazımdır? O qədər çox nə isə tələb olunmur. Əgər class konstruktora malik deyilsə, onda onun nüsxəsini sadəcə inisiallaşdırıcı istifadə etməklə new operatoru ilə yaratmaq lazımdır.


var somePoint;
somePoint = new SomePoint(x: 100, y: 50, color: "black");

Hamısı bu qədər. Bu şəkildə biz bir qrafiki nöqtəni göstərən, koordinat və rəng xassələri olan obyekt yaratdıq. Artıq indi biz onu istifadə edə bilərik.


somePoint.y = somePoint.x / 2 + 20;

Hətta yaradılmış bu obyektə xassə əlavə etmək mümkündür.


somePoint.radius = 0.5;

Lakin biz öz sinifimizi yaratmadıq. Öz sinifimizi həqiqətən yaratmaq üçün konstruktor təyin etmək lazımdır.
Əvvəlcədən bildiyimiz kimi konstruktor sinif üçün xassə təyin edir və onlara susmaya görə (default) qiymət verir. (Susmaya görə qiymət proqram kodunda sərt olaraq təyin oluna bilər və ya konstruktora parametr kimi verilə bilər.) Həmçinin konstruktor sinfə metod təyin edir (əlavə edir).

Gəlin, qrafiki nöqtə sinfini yaradaq. Bunun üçün aşağıdakı konstruktoru yazaq.


function Point(x, y, color)
{
this.x = x;
this.y = y;
this.color = color;
}

Biz cari obyektə istinad etmək (müraciət etmək) üçün yeni this operatorundan istifadə etdik. Bu operatoru yaddan çıxarmayın, o bizə çox lazım olacaq.

İndi biz Point sinfindən obyekt yarada bilərik.


var somePoint;
somePoint = new Point(100, 50, "black");

Gəlin, yenicə yaradılmış Point sinfinə metod əlavə edək. Yadda saxlayın ki, dəyişən funksiyaya göstərici saxlaya bilər. Bu dəyişən sinfin xassəsi də ola bilər.
Əvvəlcə, funksiya təyin edək. Bu metod koordinatların müəyyən aralıqda olub-olmadığını yoxlayır və buna uyğun olaraq, true və ya false cavabını qaytarır.


function isPointInBounds()
{
    if(this.x>0 && this.x<400)
    {
        return (this.y>0 && this.y<200);
}
else
{
return false;
}
}

Yuxarıda elan etdiyimiz Point sinfini yenidən təyin edək.


function Point(x, y, color)
{
this.x = x;
this.y = y;
this.color = color;
this.isPointInBounds = isPointInBounds;
}

Sonuncu sətirdə biz isPointInBounds xassəsinə isPointInBounds funksiyasına olan göstərici mənimsədirik. İndi biz bu xassəni isPointInBounds funksiyasını çağırmaq üçün istifadə edə bilərik. Faktiki olaraq, bu funksiya obyektin bir hissəsi olur, yəni metodu.


if(somePoint.isPointInBounds())
{
...
}

Əgər istifadəçi xassələrə mənimsətmək üçün lazım olan parametrləri konstruktora verməyibsə, bu zaman, xassə üçün susmaya görə olan qiymətdən istifadə etmək olar. Bunu etmək üçün || (məntiqi "və ya") operatorunun xüsusi formasından istifadə olunur.


function Point(x, y, color)
{
this.x = x || 100;
this.y = y || 50;
this.color = color || “black”;
this.isPointInBounds = isPointInBounds;
}

Əgər || operatorundan sol tərəfdə olan arqument təyin olunubsa, o qaytarılır. Əks halda, || operatorundan sağ tərəfdə olan arqument qaytarılır, bizim halda susmaya görə qiymət. Buradan belə çıxır ki, biz obyekti aşağıdakı şəkildə yarada bilərik:


somePoint = new Point();

İndi bir az əvvələ qayıdaq. İnisiallaşdırıcı ilə yaradılmış obyektə yeni xassə əlavə etdiyimizi yada salın. Biz eyni hərəkəti konstruktor ilə yaradılmış somePoint obyekti üçün də edə bilərik.


somePoint.radius = 0.5;

Amma burada qeyd etmək lazımdır ki, əlavə etdiyimiz xassə yalnız somePoint obyektinə məxsus olur, digər Point sinfindən olan obyektlərdə bu xassə olmur. Bəs bu xassənin Point sinfində olan bütün obyektlərdə olmasını necə təmin etmək olar?