İstifadəçi Sinifi: Prototip istifadə etmək
Çıxış var – obyektin prototipini istifadə edin və xassə əlavə edin.
Prototip – bu bir növ obyektin sinfinə istinaddır. JavaScriptdə olan
bütün siniflərin (hətta javascript-in daxili siniflərinin) prototype
adlı xassəsi var və onun prototipini göstərir. Prototipi sinfi
genişləndirmək üçün istifadə edirik.
Obyektə xassə əlavə etmək üçün aşağıdakı kodun əvəzinə
somePoint.radius = 0.5;
yeni xassəni onun prototipinə daxil edək(istənilən sinfə məxsus olan prototype xassəsini istifadə edərək):
Point.prototype.radius = 0.5;
İndi isə Point sinfindən olan bütün obyektlərin radius xassəsi var.
Lakin ancaq somePoint obyektinin radius xassəsi 0.5-ə mənimsədilib,
digər obyektlərdə isə bu qiymət təyin olunmayıb.
Biz həmçinin daxili sinifləri də dəyişə bilərik, xassə və metod
əlavə edə bilərik. Məsələn Math sinfinə lazımi riyazi funksiyalar və
konstantalar əlavə edə bilərik.
Lakin prototipi digər məqsədlər üçün də istifadə etmək olar. Məsələn biz sinfi irsən ala bilərik. Misal üzərində izah edək.
Tutaq ki, biz Point sinfinə bir neçə yeni xassə əlavə etmək
istəyirik. Bu hansı şəkildə edək? Əlavə olunacaq bütün yeni xassələri
həmin sinifdən olan hər hansı obyektə növbə ilə əlavə etmək olar, lakin
bu çox da yaxşı deyil. Bunu başqa cür edək. Yeni SuperPoint nöqtə sinfi
yazaq və bu sinifdə köhnə Point sinfinin bütün xassə və metodlarını
irsən alaq. SuperPoint sinfi Point sinfinin varisi olacaq və
valideyninin (və ya əcdadının) bütün xassə və metodlarını istifadə edə
biləcək. Bu şəkildə biz iki nöqtə sinfinə malik olacağıq: sadə və
təkmilləşdirilmiş.
Əvvəlcə SuperPoint sinfini və onun bütün yeni xassələrini təyin edək. Və bizim koda sətir-sətir baxaq.
function SuperPoint(x, y, color, radius, edgeColor) {
Bura qədər hər şey aydındır. Yeni sinif üçün konstruktor funksiyası
təyin etdik. Qetd edək ki, konstruktorun parametr siyahısında həm yeni
xassələri elan etdik, həm də irsən valideyn sinifdən alınan xassələri
elan etdik.
this.base = Point; this.base(x, y, color);
Biz SuperPoint sinfinin yeni base xassəsini təyin etdik və ona Point
sinfinin konstruktoruna göstərici mənimsətdik. Bundan sonra valideyn
sinfin konstruktorunu tələb olunan parametrləri verərək çağırdıq. Bu
çağırmanın nəticəsində valideyn sinifdən irsən alınan bütün xassələr
qiymət aldı. Base xassəsinin adı burada bir rol oynamır, yalnız
rahatlıq üçün belə seçilib.
this.radius = radius || 0.5; this.edgeColor = edgeColor || "black";
Burada isə yeni xassələrə ilkin qiymət veririk. Bu xassələr üçün
susmaya görə qiymət təyin olunduğuna diqqət yetirin. Bu susmaya görə
təyin olunan qiymətlər, əgər bizim bu sinfi istifadə edən proqramçı
təyin olunan qiymətlərdən birini (və ya ümumiyyətlə heç birini)
konstruktora verməzsə istifadə olunur. Susmaya görə qiymət yaxşı stil
proqramlaşdırmadır.
} SuperPoint.prototype = new Point;
Qeyd edək ki, bu sətir konstruktorun gövdəsindən kənarda yerləşir.
Artıq indi yeni sinifdən obyekt yarada və onun yeni xassələri kimi, irsən alınan xassələrini də istifadə edə bilərik.
var obj; obj = new SuperPoint(100, 100, "green”, 0.6);
Burada biz konstruktora bütün parametrləri vermədik, lakin bu qəribə
deyil, axı biz xassə üçün susmaya görə qiymətə baxmışıq.
obj.radius = Math.SQRT(5);
İndi biz SuperPoint sinfinin yeni xassəsinə müraciət etdik və ona 5-in kvadratı qiymətini mənimsətdik.
a = obj.x + 20;
İndi isə Point sinfindən irsən alınan xassəyə müraciət etdik.
Biz valideyn sinfindən irsən alınan istənilən xassə və ya metodu
yenidən təyin (override) edə bilərik. Daha bir sadə misala baxaq.
function SuperPuperPoint(x, y, color, radius, edgeColor) { this.base = SuperPoint; this.base(x, y, color, radius, edgeColor); this.isPointInBounds = isPointInBounds2;
Burada biz isPointInBounds xassəsinə digər isPointInBounds2
funksiyasına göstərici mənimsədərək isPointInBounds metodunu yenidən
təyin etdik.
} SuperPuperPoint.prototype = new SuperPoint;
Və bizim yeni sinfin valideynini göstərməyi unutmayın.
Point, SuperPoint və SuperPuperPoint siniflərinin tam kodları aşağıda verilmişdir.
<HTML> <HEAD> <TITLE> Class Test </TITLE> <script language="JavaScript"> // Begin Declaration Point class function Point(x, y, color) { this.x = x || 100; this.y = y || 50; this.color = color || "black”; this.isPointInBounds = isPointInBounds; } function isPointInBounds() { if(this.x>0 && this.x<400) { return (this.y>0 && this.y<200); } else { return false; } } // End Declaration Point class // Begin Declaration SuperPoint class function SuperPoint(x, y, color, radius, edgeColor) { this.base = Point; this.base(x, y, color); this.radius = radius || 0.5; this.edgeColor = edgeColor || "black”; } SuperPoint.prototype = new Point; // End Declaration SuperPoint class // Begin Declaration SuperPuperPoint class function SuperPuperPoint(x, y, color, radius, edgeColor) { this.base = SuperPoint; this.base(x, y, color, radius, edgeColor); this.isPointInBounds = isPointInBounds2; } SuperPuperPoint.prototype = new SuperPoint; function isPointInBounds2() { if(this.x>0 && this.x<300) { return (this.y>0 && this.y<300); } else { return false; } } // End Declaration SuperPuperPoint class </script> </HEAD>
<BODY> </BODY> </HTML>
|