البنية المختصرة لتعريف الدوال في JavaScript
بدءًا من ECMAScript 2015 (أي ES6)، يمكن تعريف الدوال التابعة للكائن بطريقة مختصرة عند تهيئة الكائنات.
البنية العامة
var obj = {
property( parameters… ) {},
*generator( parameters… ) {},
async property( parameters… ) {},
async* generator( parameters… ) {},
// مع مفاتيح محسوبة
[property]( parameters… ) {},
*[generator]( parameters… ) {},
async [property]( parameters… ) {},
// قارن مع شكل getter/setter
get property() {},
set property(value) {}
};
الوصف
البنية المختصرة لتعريف الدوال تشبه شكل تعريف getter و setter، وقد أضيفت هذه البنية في ECMAScript 2015.
لتكن لدينا الشيفرة الآتية:
var obj = {
foo: function() {
// ...
},
bar: function() {
// ...
}
};
يمكننا الآن اختصاره إلى الشكل الآتي:
var obj = {
foo() {
// ...
},
bar() {
// ...
}
};
الدوال المولِّدة
يمكن تعريف الدوال المولِّدة باستخدام البنية المختصرة أيضًا:
- يجب أن تكون النجمة * في البنية المختصرة قبل اسم خاصية الدالة المولِّدة، أي يجب أن تكون بالشكل
* g(){}
ولا يجوز استخدام g *(){}
. - لا يمكن أن تحتوي الدوال غير المولِّدة على الكلمة المحجوزة
yield
.
مثال:
// استخدام اسم للخاصية
var obj2 = {
g: function* () {
var index = 0;
while (true)
yield index++;
}
};
// نفس المثال السابق، لكن مع استخدام البنية المختصرة
var obj2 = {
* g() {
var index = 0;
while (true)
yield index++;
}
};
var it = obj2.g();
console.log(it.next().value); // 0
console.log(it.next().value); // 1
استخدام الدوال غير المتزامنة
يمكن تعريف الدوال غير المتزامنة (async functions) باستخدام البنية المختصرة:
// استخدام اسم للخاصية
var obj3 = {
f: async function () {
await some_promise;
}
};
// نفس المثال السابق، لكن مع استخدام البنية المختصرة
var obj3 = {
async f() {
await some_promise;
}
};
إنشاء دوال مولِّدة غير متزامنة
يمكن أن تكون الدوال المولِّدة غير متزامنة:
var obj4 = {
f: async function* () {
yield 1;
yield 2;
yield 3;
}
};
// الكائن نفسه لكن مع استخدام البنية المختصرة
var obj4 = {
async* f() {
yield 1;
yield 2;
yield 3;
}
};
لا يمكن إنشاء دالة بانية من هذه الدوال
جميع الدوال المُعرَّفة عبر البنية المختصرة غير قابلة للبناء (أي لا يجوز استخدام الكلمة المحجوزة new
معها)، وسيُرمى الخطأ TypeError
إذا حاولنا ذلك:
var obj = {
method() {}
};
new obj.method; // TypeError: obj.method is not a constructor
var obj = {
* g() {}
};
new obj.g; // TypeError: obj.g is not a constructor
أمثلة
مثالٌ بسيط
سنُنشِئ دالةً باسم b()
في الكائن obj
باستخدام البنية المختصرة:
var obj = {
a: 'foo',
b() { return this.a; }
};
console.log(obj.b()); // "foo"
أسماء الخاصيات المحسوبة
تسمح البنية المختصرة باستخدام أسماء محسوبة للخاصيات:
var bar = {
foo0: function() { return 0; },
foo1() { return 1; },
['foo' + 2]() { return 2; }
};
console.log(bar.foo0()); // 0
console.log(bar.foo1()); // 1
console.log(bar.foo2()); // 2
دعم المتصفحات
الميزة | Chrome | Firefox | Internet Explorer | Opera | Safari |
---|---|---|---|---|---|
الدعم الأساسي | 39 | 34 | غير مدعومة | 26 | غير مدعومة |
على النقيض من متصفح IE، يدعم متصفح Edge هذه الميزة.
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2016.
- معيار ECMAScript 2015 (6th Edition).