Function.name

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

الخاصية Function.name تُعيد اسم الدالة.

سمات الخاصية Function.name
قابلة للكتابة لا
قابلة للإحصاء لا
قابلة للضبط نعم

لاحظ أنَّ المتصفحات التي كانت تدعم هذه الخاصية قبل أن تصبح معياريةً (في ECMAScript 2015) كانت تضبط السمة configurable إلى false (أي أنَّ هذه الخاصية غير قابلة للضبط).

أمثلة

اسم دالة مُصرَّح عنها

الخاصية name تُعيد اسم الدالة المستخدم في تعبير التصريح عن الدوال:
function doSomething() {}
doSomething.name; // "doSomething"

اسم دالة مُعرَّفة عبر الدالة البانية Function

الدوال المُنشَأة عبر البنية new Function(...)‎ أو Function(...)‎ تؤدي إلى إنشاء كائنات Function ويكون اسم تلك الدوال هو anonymous:
(new Function).name; // "anonymous"

الاستدلال على أسماء الدوال

يمكن للمتغيرات والدوال الدلالة على اسم دالة مجهولة (anonymous function) من مكانها البنيوي (ميزة جديدة في ECMAScript 2015):
var f = function() {};
var object = {
  someMethod: function() {}
};

console.log(f.name); // "f"
console.log(object.someMethod.name); // "someMethod"
لاحظ أنَّ بالإمكان تعريف دالة عبر تعابير تعريف الدوال (function expression) ويكون تلك الدالة اسمٌ مرتبطٌ بها:
var object = {
  someMethod: function object_someMethod() {}
};
console.log(object.someMethod.name); // "object_someMethod"

try { object_someMethod } catch(e) { console.log(e); }
// ReferenceError: object_someMethod is not defined
لا يمكن تعديل اسم الدالة، لأنَّ هذه الخاصية للقراءة فقط:
var object = {
  // anonymous
  someMethod: function() {}
};

object.someMethod.name = 'otherMethod';
console.log(object.someMethod.name); // someMethod
لكن يمكن استخدام الدالة Object.defineProperty()‎ لتعديل الاسم:
var object = {
  // anonymous
  someMethod: function() {}
};

Object.defineProperty(object.someMethod, 'name', { value: 'otherMethod' });
console.log(object.someMethod.name); // otherMethod

أسماء الدوال المُعرَّفة بالطريقة المختصرة

var o = {
  foo(){}
};
o.foo.name; // "foo";

أسماء الدوال المرتبطة بالكائنات

الدالة Function.bind()‎ تؤدي إلى إضافة الكلمة "bound" قبل اسم الدالة:
function foo() {}; 
foo.bind({}).name; // "bound foo"

أسماء دوال getter و setter

عند استخدام خاصيات getter و setter، فستُظهِر الكلمة "get" أو "set" قبل اسم الدالة؛ لاحظ كيف استخدمنا الدالة getOwnPropertyDescriptor للحصول على مرجعية لهذه الخاصيات:
var o = { 
  get foo(){}, 
  set foo(x){} 
}; 

var descriptor = Object.getOwnPropertyDescriptor(o, "foo"); 
descriptor.get.name; // "get foo" 
descriptor.set.name; // "set foo";

أسماء الدوال في الأصناف

يمكنك استخدام الخاصية obj.constructor.name لمعرفة ما هو «صنف» الكائن:
function Foo() {}  // ES2015 Syntax: class Foo {}

var fooInstance = new Foo();
console.log(fooInstance.constructor.name); // "Foo"
تحذير: ستكون هذه الخاصية متاحةً فقط إذا لم تُعرِّف الدالة البانية خاصيةً تابعةً لها باسم name. وهذا يعني أنَّ عليك ألّا تعتمد على الخاصية Function.name للحصول على اسم الصنف.

استخدام الرموز كأسماء دوال

إذا استخدمنا رمزًا Symbol، اسمًا للدالة، وكان لهذا الرمز وصفٌ، فسيكون اسم الدالة هو وصف الرمز لكن بين قوسين مربعين:
var sym1 = Symbol("foo"); 
var sym2 = Symbol(); 
var o = { 
  [sym1]: function(){}, 
  [sym2]: function(){} 
}; 

o[sym1].name; // "[foo]"
o[sym2].name; // ""

تصغير حجم ملفات JavaScript

خذ حذرك عند استخدام الخاصية Function.name عند وجود احتمال لحدوث تغييرات في الشيفرة، كالتي تحدث عند تصغير حجم ملفات JavaScript، فتُستخدَم أدوات الضغط وتصغير حجم ملفات JavaScript كجزء من آلية نشر برمجيات JavaScript. مثل هذه التحويلات تُغيّر اسم الدوال في وقت البناء عادةً.

فمثلًا، الشيفرة الآتية:
function Foo() {};
var foo = new Foo();

if (foo.constructor.name === 'Foo') {
  console.log("'foo' is an instance of 'Foo'");
} else {
  console.log('Oops!');
}
يمكن أن تُضغَط إلى:
function a() {};
var b = new a();
if (b.constructor.name === 'Foo') {
  console.log("'foo' is an instance of 'Foo'");
} else {
  console.log('Oops!');
}
ففي النسخة غير المضغوطة، كانت نتيجة الشرط هي true، بينما في النسخة المضغوطة كانت false؛ لذا إذا كنت تعتمد على قيمة الخاصية Function.name كما في المثال السابق، فاحرص على ضبط برمجيات الضغط لكي لا تُغيّر أسماء الدوال، أو افترض عدم امتلاك الدالة لاسمٍ معيّن عند برمجتك لها.

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

الميزة Chrome Firefox Internet Explorer Opera Safari
الدعم الأساسي 15 نعم غير مدعومة نعم نعم

على النقيض من متصفح IE، يدعم متصفح Edge هذه الميزة.

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