دالة getter في JavaScript

من موسوعة حسوب
اذهب إلى: تصفح، ابحث

البنية get تؤدي إلى ربط خاصية من خاصيات الكائن بدالة التي ستستدعى عند محاولة الوصول إلى قيمة تلك الخاصية.

البنية العامة

{get prop() { ... } }
{get [expression]() { ... } }

prop

اسم الخاصية الذي سترتبط بالدالة المعطية.

expression

بدءًا من ECMAScript 2015 (أي ES6)، يمكن استخدام التعابير لإنشاء أسماء محسوبة للخاصيات التي سترتبط بالدالة المعطية.

الوصف

يمكن أن تستخدم دالة getter في JavaScript لتنفيذ دالة معيّنة عندما تتم محاولة الوصول إلى خاصية من خاصيات الكائن بغية إعادة قيمة محسوبة ديناميكيًا، ولا يجوز استخدام دالة getter على خاصية تحمل قيمةً ما في نفس الوقت. يجدر بالذكر أنَّ دوال getter تُستخدَم عادةً مع دوال setter لإنشاء «خاصية زائفة» (pseudo-property).

لاحظ الأمور الآتية عند التعامل مع بنية get:

  • يمكنها أن تملك مُعرِّفًا رقميًا أو سلسلةً نصيةً.
  • يجب ألّا يكون لها أيّة وسائط.
  • لا يجوز تعريف أكثر من دالة getter لنفس الخاصية، ولا يجوز أن تُسنَد قيمةٌ إلى الخاصية مسبقًا (أي لا يجوز استخدام ‎‎‎{ get x(v) { }, get x(v) { } }‎ أو ‎{ x: ..., get x(v) { } }‎‎).

يمكن إزالة دالة getter باستخدام المعامل delete.

أمثلة

تعريف دالة getter عند تهيئة الكائنات

المثال الآتي يُعرِّف خاصيةً زائفةً باسم latest في الكائن obj، وهذه الخاصية ستُعيد آخر عنصر في المصفوفة log:
var obj = {
  log: ['example','test'],
  get latest() {
    if (this.log.length == 0) return undefined;
    return this.log[this.log.length - 1];
  }
}
console.log(obj.latest); // "test".
لاحظ أنَّ محاولة إسناد قيمة إلى الخاصية latest لن تؤدي إلى تغييرها.

إزالة دالة getter باستخدام المعامل delete

إذا أردتَ إزالة دالة getter، فيمكنك استخدام المعامل delete عليها كما يلي:
delete obj.latest;

تعريف دالة getter باستخدام defineProperty

إذا أردتَ إضافة دالة getter إلى كائن موجود مسبقًا في أيّ وقت، فيمكنك استخدام الدالة Object.defineProperty()‎ كما في المثال الآتي:
var o = {a: 0};

Object.defineProperty(o, 'b', { get: function() { return this.a + 1; } });

console.log(o.b) // استدعاء الدالة، التي ستُعيد قيمة المتغير + 1

استخدام أسماء الخاصيات المحسوبة

var expr = 'foo';

var obj = {
  get [expr]() { return 'bar'; }
};

console.log(obj.foo); // "bar"

دعم المتصفحات

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 1 2 9 9.5 3
أسماء الخاصيات المحسوبة 46 34 غير مدعومة 47 غير مدعومة

مصادر ومواصفات