Function.name
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since авгÑÑÑ 2016 г..
Read-only ÑвойÑÑво name глобалÑного обÑекÑа Function и его ÑкземплÑÑов ÑодеÑÐ¶Ð¸Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ ÑÑнкÑии Ñозданное во вÑÐµÐ¼Ñ Ð¾Ð¿ÑÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ ÑÑнкÑии или пÑиÑÐ²Ð°Ð¸Ð²Ð°Ð½Ð¸Ñ ÑÑÑлки на ÑÑнкÑÐ¸Ñ Ð¿ÐµÑеменной, ÑвойÑÑвÑ, аÑгÑменÑÑ Ð¸ Ñ. п. ÐÐ»Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½ÑÑ
ÑÑнкÑий ÑÑо ÑвойÑÑво Ð¼Ð¾Ð¶ÐµÑ Ð¸Ð¼ÐµÑÑ Ð·Ð½Ð°Ñение "anonymous" или пÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ "".
ÐнÑеÑакÑивнÑй пÑимеÑ
const func1 = function () {};
const object = {
func2: function () {},
};
console.log(func1.name);
// Expected output: "func1"
console.log(object.func2.name);
// Expected output: "func2"
ÐнаÑение
СÑÑока.
ÐÑÑибÑÑÑ ÑвойÑÑва Function.name | |
|---|---|
| ÐапиÑÑваемое | Ð½ÐµÑ |
| ÐеÑеÑиÑлÑемое | Ð½ÐµÑ |
| ÐаÑÑÑаиваемое | да |
ÐÑимеÑание:
ÐамеÑÑÑе, ÑÑо в неÑÑандаÑÑном, pre-ES2015 Ñелизе configurable ÑвойÑÑво бÑло false
ÐÑимеÑÑ
>ÐÐ¼Ñ Ð¾Ð±ÑÑвленной ÑÑнкÑии
СвойÑÑво name возвÑаÑÐ°ÐµÑ Ð¸Ð¼Ñ ÑÑнкÑии, либо пÑÑÑÑÑ ÑÑÑÐ¾ÐºÑ Ð´Ð»Ñ Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½ÑÑ
ÑÑнкÑий:
function doSomething() {}
alert(doSomething.name); // вÑÐ²ÐµÐ´ÐµÑ "doSomething"
ÐÐ¼Ñ ÑÑнкÑии-конÑÑÑÑкÑоÑа
ФÑнкÑии, ÑозданнÑе ÑинÑакÑиÑом new Function(...) или пÑоÑÑо Function(...) ÑоздаÑÑ Function и имеÑÑ name "anonymous":
new Function().name; // "anonymous"
ÐÑедполагаемÑе имена ÑÑнкÑий
ÐеÑеменнÑе и меÑÐ¾Ð´Ñ Ð¼Ð¾Ð³ÑÑ Ð¿ÑедположиÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ анонимной ÑÑнкÑии из ÐµÑ ÑинÑакÑиÑеÑкой позиÑии (new in 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 = {
// Ð°Ð½Ð¾Ð½Ð¸Ð¼Ð½Ð°Ñ ÑÑнкÑиÑ
someMethod: function () {},
};
object.someMethod.name = "otherMethod";
alert(object.someMethod.name); //someMethod
ÐÐ»Ñ Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ name можно иÑполÑзоваÑÑ Object.defineProperty().
СокÑаÑÑннÑе имена меÑодов
var o = {
foo() {},
};
o.foo.name; // "foo";
Ðмена ÑÑнкÑий поÑле пÑивÑзки
Function.bind() пÑÐ¾Ð¸Ð·Ð²Ð¾Ð´Ð¸Ñ ÑÑнкÑиÑ, полÑÑаÑÑÑÑ Ð¸Ð¼Ñ "bound и название Ñамой ÑÑнкÑии.
function foo() {}
foo.bind({}).name; // "bound foo"
Ðмена ÑÑнкÑий Ð´Ð»Ñ getters и setters
Ðогда иÑполÑзÑÑÑÑÑ get и set, "get" и "set" поÑвÑÑÑÑ Ð² имени ÑÑнкÑии.
let 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 ÑÑÐ¾Ð±Ñ Ð¿ÑовеÑиÑÑ "class" обÑекÑа (ÑиÑайÑе пÑедÑпÑеждение ниже):
function Foo() {} // ES2015 Syntax: class Foo {}
var fooInstance = new Foo();
console.log(fooInstance.constructor.name); // logs "Foo"
ÐÑедÑпÑеждение:
ÐнÑеÑпÑеÑаÑÐ¾Ñ Ð¾Ð±ÑÑÐ²Ð¸Ñ Ð²ÑÑÑоенное Function.name ÑвойÑÑво ÑолÑко еÑли ÑÑнкÑÐ¸Ñ Ð½Ðµ Ð¸Ð¼ÐµÐµÑ Ñвоего ÑобÑÑвенного ÑвойÑÑва name (Ñм. 9.2.11 of the ECMAScript2015 Language Specification). Ðднако, в ES2015 ÑÑаÑиÑнÑе меÑÐ¾Ð´Ñ Ð¿ÐµÑезапиÑÑваÑÑ OwnProperty конÑÑÑÑкÑоÑов клаÑÑа-ÑÑнкÑии (ECMAScript2015, 14.5.14.21.b + 12.2.6.9).
Таким обÑазом, нелÑÐ·Ñ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к name лÑбого клаÑÑа Ñо ÑÑаÑиÑнÑм ÑвойÑÑвом name():
class Foo {
constructor() {}
static name() {}
}
Со static name() меÑодом Foo.name болÑÑе не ÑодеÑÐ¶Ð¸Ñ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ клаÑÑа, но оÑÑÑÐ»Ð°ÐµÑ Ðº ÑÑнкÑии name(). ÐÑиведÑнное вÑÑе опÑеделение клаÑÑа в ES2015 бÑÐ´ÐµÑ Ð²ÐµÑÑи ÑÐµÐ±Ñ Ð² Chrome и Firefox как в ES5:
function Foo() {}
Object.defineProperty(Foo, 'name', { writable: true });
Foo.name = function() {};
ÐÑÑаÑÑÑ Ð¿Ð¾Ð»ÑÑиÑÑ Ð´Ð¾ÑÑÑп к fooInstance Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ fooInstance.constructor.name не даÑÑ Ð½Ð°Ð·Ð²Ð°Ð½Ð¸Ðµ клаÑÑа, но вÑÐ²ÐµÐ´ÐµÑ Ð¼ÐµÑод name(). ÐÑимеÑ:
let fooInstance = new Foo(); console.log(fooInstance.constructor.name); // logs function name()
Ðз ES5 syntax пÑимеÑа Ñакже видно, ÑÑо в Chrome или Firefox ÑÑаÑиÑное опÑеделение Foo.name ÑÑановиÑÑÑ Ð·Ð°Ð¿Ð¸ÑÑваемÑм (writable). ÐÑÑÑоенное опÑеделение в оÑÑÑÑÑÑвии каÑÑомного ÑÑаÑиÑного меÑодадоÑÑÑпно ÑолÑко Ð´Ð»Ñ ÑÑениÑ:
Foo.name = 'Hello'; console.log(Foo.name); // logs "Hello" if class Foo has a static name() property but "Foo" if not.
СледоваÑелÑно не ожидайÑе, ÑÑо Function.name ÑвойÑÑво бÑÐ´ÐµÑ Ð²Ñегда ÑодеÑжаÑÑ Ð¸Ð¼Ñ ÐºÐ»Ð°ÑÑа.
Ðмена ÑÑнкÑий-Ñимволов
ÐÑли Ñ Symbol обÑÑвлÑеÑÑÑ Ð¸Ð¼Ñ, Ñо название меÑода - ÑÑо Ð¸Ð¼Ñ ÐºÐ²Ð°Ð´ÑаÑнÑÑ
ÑкобкаÑ
.
let sym1 = Symbol("foo");
let sym2 = Symbol();
let o = {
[sym1]: function () {},
[sym2]: function () {},
};
o[sym1].name; // "[foo]"
o[sym2].name; // ""
JavaScript миниÑиÑиÑованнÑй
ÐÑедÑпÑеждение:
ÐÑдÑÑе оÑÑоÑожнÑ, иÑполÑзÑÑ Function.name и Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ source кода Ñ Ð¿Ð¾Ð¼Ð¾ÑÑÑ JavaScript compressors (minifiers) или обÑÑÑкаÑоÑов. ÐÑи инÑÑÑÑменÑÑ ÑаÑÑо иÑполÑзÑÑÑÑÑ, как вÑÑÑоеннÑе в JavaScript build pipeline, ÑÑÐ¾Ð±Ñ ÑокÑаÑиÑÑ ÑÐ°Ð·Ð¼ÐµÑ Ð±Ð¸Ð»Ð´Ð° пеÑед деплоем в production. Такие ÑÑанÑÑоÑмаÑии ÑаÑÑо изменÑÑÑ Ð¸Ð¼ÐµÐ½Ð° ÑÑнкÑий.
Такой source code:
function Foo() {};
let foo = new Foo();
if (foo.constructor.name === 'Foo') {
console.log("'foo' is an instance of 'Foo'");
} else {
console.log('Oops!');
}
Ð¼Ð¾Ð¶ÐµÑ Ð±ÑÑÑ ÑÐ¶Ð°Ñ Ð²:
function a() {};
let b = new a();
if (b.constructor.name === 'Foo') {
console.log("'foo' is an instance of 'Foo'");
} else {
console.log('Oops!');
}
РнеÑжаÑой веÑÑии код вÑполнÑеÑÑÑ Ð¾Ð¶Ð¸Ð´Ð°ÐµÐ¼Ð¾ "'foo' is an instance of 'Foo'". Ð Ñо вÑемÑ, как в ÑжаÑой веÑÑии он ведÑÑ ÑÐµÐ±Ñ Ð¸Ð½Ð°Ñе. ÐÑли Ð²Ñ Ð¿Ð¾Ð»Ð°Ð³Ð°ÐµÑеÑÑ Ð½Ð° Function.name, как в пÑимеÑе, Ñо ÑбедиÑеÑÑ, ÑÑо pipeline не менÑÐµÑ ÐºÐ¾Ð´ или не ожидайÑе Ð¾Ñ ÑÑнкÑии опÑеделÑнного имени.
СпеÑиÑикаÑии
| Specification |
|---|
| ECMAScript® 2027 Language Specification> # sec-function-instances-name> |