دالة setter في JavaScript

من موسوعة حسوب

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

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

{set prop(val) { . . . }}
{set [expression](val) { . . . }}

prop

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

val

اسم المتغير الذي سيحمل القيمة التي تتم محاولة إسنادها إلى الخاصية prop.

expression

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

الوصف

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

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

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

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

أمثلة

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

المثال الآتي يُعرِّف خاصيةً زائفةً باسم current تحمل لغة الكائن، وعند إسناد قيمة لهذه الخاصية فستستدعى الدالة المرتبطة معها وستُحِّدث قيمة الخاصية log وستُضيف القيمة إليها:

var language = {
  set current(name) {
    this.log.push(name);
  },
  log: []
}

language.current = 'EN';
console.log(language.log); // ['EN']

language.current = 'FA';
console.log(language.log); // ['EN', 'FA']

لاحظ أنَّ الخاصية current غير مُعرِّفة، وأيّة محاولة للوصول إليها ستؤدي إلى إعادة القيمة undefined.

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

إذا أردتَ إزالة دالة setter، فيمكنك استخدام المعامل delete عليها كما يلي:

delete o.current;

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

إذا أردتَ إضافة دالة setter إلى كائن موجود مسبقًا في أيّ وقت، فيمكنك استخدام الدالة Object.defineProperty()‎ كما في المثال الآتي:

var o = {a: 0};

Object.defineProperty(o, 'b', { set: function(x) { this.a = x / 2; } });

o.b = 10; // إسناد القيمة 10 / 2 (أي 5) إلى الخاصية
console.log(o.a) // 5

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

var expr = 'foo';

var obj = {
  baz: 'bar',
  set [expr](v) { this.baz = v; }
};

console.log(obj.baz); // "bar"
obj.foo = 'baz';      // استدعاء الدالة
console.log(obj.baz); // "baz"

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

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

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