الفرق بين المراجعتين لصفحة: «JavaScript/Function/name»
لا ملخص تعديل |
ط استبدال النص - '\[\[تصنيف:(.*)\]\]' ب'{{SUBPAGENAME}}' |
||
سطر 160: | سطر 160: | ||
*مسودة المعيار [https://tc39.github.io/ecma262/#sec-name ECMAScript Latest Draft]. | *مسودة المعيار [https://tc39.github.io/ecma262/#sec-name ECMAScript Latest Draft]. | ||
*معيار [http://www.ecma-international.org/ecma-262/6.0/#sec-name ECMAScript 2015 (6th Edition)]. | *معيار [http://www.ecma-international.org/ecma-262/6.0/#sec-name ECMAScript 2015 (6th Edition)]. | ||
[[تصنيف:JavaScript]] | [[تصنيف:JavaScript|{{SUBPAGENAME}}]] | ||
[[تصنيف:JavaScript Global Objects]] | [[تصنيف:JavaScript Global Objects|{{SUBPAGENAME}}]] | ||
[[تصنيف:JavaScript Function]] | [[تصنيف:JavaScript Function|{{SUBPAGENAME}}]] |
المراجعة الحالية بتاريخ 15:40، 28 يناير 2018
الخاصية 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 هذه الميزة.
مصادر ومواصفات
- مسودة المعيار ECMAScript Latest Draft.
- معيار ECMAScript 2015 (6th Edition).