دالة 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 | غير مدعومة |
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).
- معيار ECMAScript 5.1.