آموزش جاوا اسکریپت Java Script قسمت دهم

اکرم کریمی 1395/4/17 1385

آموزش جاوا اسکریپت Java Script قسمت دهم

با سلام خدمت همه شما، کریمی هستم با قسمت دهم آموزش جاوا اسکریپت در خدمت شما هستم.

در جلسه پیش، در مورد نحوه ایجاد یک کلاس، پراپرتی ها و متدهای یک کلاس، متد سازنده کلاس (constructor)، آورلودها (overload) و همچنین تفاوت پراپرتی و متد با متغیرها و توابع خصوصی در یک کلاس صحبت کردیم. اگر سوالی در مورد جلسه قبل هست، سوالتون رو با @AkramKarimi در گروه های برنامه نویسان مطرح نمایید.

و اما ادامه مبحث شئ گرایی در جاوا اسکریپت.

تعریف یک شئ:

برای تعریف یک شئ می توان به صورت زیر عمل کرد:

var person = new Object();
person.firstName = “Ali”;
person.lastName = “Karimi”;
person.sayHello = function() { console.log(“Hello “ + this.firstName);};
}

حال اگر بخواهیم از این شئ بیش از یکی داشته باشیم مجبوریم مجددا این ساختار را تکرار کنیم. پس اینجاست که ایجاد یک کلاس به داد ما میرسد.

function Person(name, family){
 this.firstName = name;
 this.lastName = family;
 this.sayHello = function() { console.log(“Hello “ + this.firstName)};
}
var person1 = new Person(“Ali”, “Karimi”);
var person2 = new Person(“Ali”, “Alavi”);

همانطور که دیدیم، برای تعریف یک متد سازنده و نوشتن کد درون آن متد، کدها را درون بدنه اصلی تابع که به آن کلاس می گفتیم قرار می دادیم، اگر هم میخواستیم پارامترهایی را به متد سازنده ارسال کنیم، باید برای تابع اصلی در تعریف کلاس، ورودی هایی در نظر می گرفتیم. در واقع متد سازنده ی ما همان کلاس ما بود، از این رو به این توابع Constructor Function می گویند. و در واقع در جاوا اسکریپت مشابه ترین مفهوم به مفهوم کلاس، Constructor Function ها هستند. (در کل ما در جاوا اسکریپت مفهومی به عنوان کلاس نداریم، اما برای پیاده سازی مفهومی معادل آن از Constructor Function استفاده می شود)

Prototype:

پروتوتایپ از کلمه یونانی prototypon به معنای ساختار اولیه گرفته شده است.

در صورتی که ما تابع سازنده ای را از قبل داریم اما نمی خواهیم در اصل آن تابع سازنده تغییری ایجاد کنیم و یا حتی اینکه به آن تابع سازنده دسترسی نداریم آنگاه برای افزودن یک متد جدید به تابع سازنده مورد نظر از prototype استفاده می کنیم و در واقع به prototype آن این متد را اضافه میکنیم. می توان گفت این روش همانند تعریف extension method هستند.

تابع سازنده Person را در نظر بگیرید، فرض کنید ما میخواهیم متد toString را برای این سازنده بازنویسی کنیم. توجه کنید که میخواهیم این متد را بازنویسی کنیم، اگر متدی که اصلا از قبل وجود نداشت را هم میخواستیم بنویسیم، روند کار هیچ تفاوتی با حال نداشت.

Person.prototype.toString = function(){
 return this.firstName + “ “ + this.lastName;
}
var person = new Person(“Ali”, “Karimi”); // ایجاد شئ ای با نام علی و نام خانوادگی کریمی
document.write(person.toString()); // return “Ali Karimi”

این متد یا تابع هم میتواند مانند دیگر توابع ورودی های متعدد داشته باشد یا اینکه هیچ آرگومان ورودی ای نداشته باشد، و همچنین می تواند حداکثر یک خروجی داشته باشد (یعنی می تواند خروجی نداشته باشد).

ارث بری در جاوا اسکریپت:

برای ارث بری در جاوا اسکریپت، یک شئ می تواند خصوصیات خود را از یک شئ دیگر به ارث ببرد. شئ ای که خصوصیات خود را به ارث می دهد prototype شئ ارث گیرنده می شود. پس زمانی که یک متد از یک شئ فراخوانی می شود، جاوااسکریپت ابتدا به دنبال آن متد در خود شئ و در صورتی که پیدا نکرد در prototype آن شئ جستجو میکند و همینطور به سمت بالا می رود تا به آخرین پروتوتایپ یعنی Object برسد. پروتوتایپ هر شئ از تابع سازنده آن شئ تشکیل می شود. زیرا همه اشیاء از این شئ ارث بری می کنند.

برای ارث بری در یک تابع سازنده، باید تابع سازنده والد در پروتوتایپ یا همان تابع سازنده فرزند فراخوانی شود.

function Rectangle(x,y){
 this.x = x;
 this.y = y;
}
// Define a function in prototype.
// Child objects will inherit it.
Rectangle.prototype.area = function(){
 return this.x * this.y;
}
function Square(x){
 Rectangle.call(this,x,x);// Call parent constructor with context switch.
}
Square.prototype = new Rectangle(); // Chain Square prototype to Rectangle

Square.prototype.constructor = Square; // Define constructor for this prototype

Square.prototype.perimeter = function(){
 return this.x * 4;
}
var mySquare = new Square(3);
mySquare.area(); // Returns 9

(mySquare instanceof Square); // returns true
(mySquare instanceof Rectangle); // returns true

در این نمونه ما یک سازنده Rectangle داریم و بعد از آن تابع area را به این پروتوتایپ این سازنده اضافه کرده ایم. این متد به اشیایی که از این پروتوتایپ ارث بری میکنند نیز به ارث میرسد.

بعد از آن سازنده Square را داریم که از پروتوتایپ Rectangle ارث بری میکند. و همانطور که میبینید برای فراخوانی سازنده والد خود از دستور call استفاده کرده و شئ جاری خود را به همراه پارامترهای ورودی لازم برای سازنده والد ارسال میکند.

دانلود pdf قسمت دهم آموزش جاوا اسکریپت

قسمت بعدی قسمت قبلی