روش‌های دسترسی به شیء

از ویکی‌کد، دانشنامهٔ برنامه‌نویسی
پرش به ناوبری پرش به جستجو


روش های دسترسی در جاوا اسکریپت (متدهای Getters و Setters)

در نسخه ECMAScript 5 (2009) متدهای Getter و Setters تعریف شدند.[۱]

متدهای getter و setter به شما اجازه می‌دهد که برای شی خود دسترسی دهنده (برای ویژگی‌های محاسبه شده) تعریف کنید.

متد Getter (کلمه کلیدی get)

این مثال از خصوصیت lang برای get کردن خصوصیت language استفاده می‌کند.

مثال

 1// Create an object:
 2var person = {
 3  firstName: "John",
 4  lastName : "Doe",
 5  language : "en",
 6  get lang() {
 7    return this.language;
 8  }
 9};
10
11// Display data from the object using a getter:
12document.getElementById("demo").innerHTML = person.lang;


مشاهدهٔ نتیجه


متد Setter (کلمه کلیدی set)

این مثال از خصوصیت lang برای set کردن خصوصیت language استفاده می‌کند.

مثال

 1var person = {
 2  firstName: "John",
 3  lastName : "Doe",
 4  language : "",
 5  set lang(lang) {
 6    this.language = lang;
 7  }
 8};
 9
10// Set an object property using a setter:
11person.lang = "en";
12
13// Display data from the object:
14document.getElementById("demo").innerHTML = person.language;


مشاهدهٔ نتیجه


تابع (Getter) در جاوا اسکریپت؟

تفاوت بین این دو مثال چیست؟

مثال ۱

 1var person = {
 2  firstName: "John",
 3  lastName : "Doe",
 4  fullName : function() {
 5    return this.firstName + " " + this.lastName;
 6  }
 7};
 8
 9// Display data from the object using a method:
10document.getElementById("demo").innerHTML = person.fullName();


مشاهدهٔ نتیجه


مثال ۲

 1var person = {
 2  firstName: "John",
 3  lastName : "Doe",
 4  get fullName() {
 5    return this.firstName + " " + this.lastName;
 6  }
 7};
 8
 9// Display data from the object using a getter:
10document.getElementById("demo").innerHTML = person.fullName;


مشاهدهٔ نتیجه


مثال ۱ به fullName همانند یک تابع دسترسی پیدا می‌کند: person.fullName()

مثال ۲ به fullName به صورت یک ویژگی دسترسی پیدا می‌کند: person.fullName

مثال دوم از شیوه نوشتار (syntax) ساده‌تری برخوردار است.

کیفیت داده

جاوا اسکریپت می‌تواند زمانی که شما از getters و setters استفاده می‌کنید کیفیت داده بهتری را ارائه دهد.

با استفاده از ویژگی language در مثال زیر، مقدار ویژگی lang به صورت تمام حروف بزرگ به ما برمی گردد:

مثال

 1// Create an object:
 2var person = {
 3  firstName: "John",
 4  lastName : "Doe",
 5  language : "en",
 6  get lang() {
 7    return this.language.toUpperCase();
 8  }
 9};
10
11// Display data from the object using a getter:
12document.getElementById("demo").innerHTML = person.lang;


مشاهدهٔ نتیجه


استفاده از ویژگی language در مثالزیر، مقدار تمام حروف بزرگ را در ویژگی lang ذخیره می‌کند:

مثال

 1var person = {
 2  firstName: "John",
 3  lastName : "Doe",
 4  language : "",
 5  set lang(lang) {
 6    this.language = lang.toUpperCase();
 7  }
 8};
 9
10// Set an object property using a setter:
11person.lang = "en";
12
13// Display data from the object:
14document.getElementById("demo").innerHTML = person.language;


مشاهدهٔ نتیجه


چرا باید از Getter و Setter استفاده کنیم؟

  • شیوه نوشتار ساده‌تری را دارد
  • این امر به ما اجازه می‌دهد که از شیوه نوشتار یکسانی برای ویژگی‌ها و متدها استفاده کنیم
  • موجب افزایش کیفیت داده می‌شود
  • این روش برای انجام کارهایی در پس زمینه مناسب است

متد Object.defineProperty()

از متد Object.defineProperty() همچنین می‌توان برای اضافه کردن متدهای Getters و Setters استفاده کرد:

مثال

 1// Define object
 2var obj = {counter : 0};
 3
 4// Define setters
 5Object.defineProperty(obj, "reset", {
 6  get : function () {this.counter = 0;}
 7});
 8Object.defineProperty(obj, "increment", {
 9  get : function () {this.counter++;}
10});
11Object.defineProperty(obj, "decrement", {
12  get : function () {this.counter--;}
13});
14Object.defineProperty(obj, "add", {
15  set : function (value) {this.counter += value;}
16});
17Object.defineProperty(obj, "subtract", {
18  set : function (value) {this.counter -= value;}
19});
20
21// Play with the counter:
22obj.reset;
23obj.add = 5;
24obj.subtract = 1;
25obj.increment;
26obj.decrement;


مشاهدهٔ نتیجه


سازگاری با مرورگرها

متدهای Getters و Setters در اینترنت اکسپلور نسخه ۸ یا قدیمی‌تر پشتیبانی نمی‌شوند:

Chrome.gif Edge.gif Firefox.gif Safari.gif Opera.gif
بله ۹٫۰ بله بله بله

منابع آموزشی