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

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


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

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

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

متد Getter (کلمه کلیدی get)[ویرایش | ویرایش]

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

مثال[ویرایش | ویرایش]

// Create an object:
var person = {
  firstName: "John",
  lastName : "Doe",
  language : "en",
  get lang() {
    return this.language;
  }
};

// Display data from the object using a getter:
document.getElementById("demo").innerHTML = person.lang;


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


متد Setter (کلمه کلیدی set)[ویرایش | ویرایش]

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

مثال[ویرایش | ویرایش]

var person = {
  firstName: "John",
  lastName : "Doe",
  language : "",
  set lang(lang) {
    this.language = lang;
  }
};

// Set an object property using a setter:
person.lang = "en";

// Display data from the object:
document.getElementById("demo").innerHTML = person.language;


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


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

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

مثال ۱[ویرایش | ویرایش]

var person = {
  firstName: "John",
  lastName : "Doe",
  fullName : function() {
    return this.firstName + " " + this.lastName;
  }
};

// Display data from the object using a method:
document.getElementById("demo").innerHTML = person.fullName();


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


مثال ۲[ویرایش | ویرایش]

var person = {
  firstName: "John",
  lastName : "Doe",
  get fullName() {
    return this.firstName + " " + this.lastName;
  }
};

// Display data from the object using a getter:
document.getElementById("demo").innerHTML = person.fullName;


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


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

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

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

کیفیت داده[ویرایش | ویرایش]

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

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

مثال[ویرایش | ویرایش]

// Create an object:
var person = {
  firstName: "John",
  lastName : "Doe",
  language : "en",
  get lang() {
    return this.language.toUpperCase();
  }
};

// Display data from the object using a getter:
document.getElementById("demo").innerHTML = person.lang;


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


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

مثال[ویرایش | ویرایش]

var person = {
  firstName: "John",
  lastName : "Doe",
  language : "",
  set lang(lang) {
    this.language = lang.toUpperCase();
  }
};

// Set an object property using a setter:
person.lang = "en";

// Display data from the object:
document.getElementById("demo").innerHTML = person.language;


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


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

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

متد Object.defineProperty()[ویرایش | ویرایش]

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

مثال[ویرایش | ویرایش]

// Define object
var obj = {counter : 0};

// Define setters
Object.defineProperty(obj, "reset", {
  get : function () {this.counter = 0;}
});
Object.defineProperty(obj, "increment", {
  get : function () {this.counter++;}
});
Object.defineProperty(obj, "decrement", {
  get : function () {this.counter--;}
});
Object.defineProperty(obj, "add", {
  set : function (value) {this.counter += value;}
});
Object.defineProperty(obj, "subtract", {
  set : function (value) {this.counter -= value;}
});

// Play with the counter:
obj.reset;
obj.add = 5;
obj.subtract = 1;
obj.increment;
obj.decrement;


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


سازگاری با مرورگرها[ویرایش | ویرایش]

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

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

منابع آموزشی[ویرایش]