JavaScript

Function.nameプロパティ

 編集:2022.07.27 by T.A.

標準外であった ES2015 以前の実装では、configurable 属性も false であることに注意してください。

JavaScript の圧縮とミニファイ

警告: Function.name を使用しているときに、JavaScript の圧縮(ミニファイ)や難読化のような変換を行う際には注意が必要です。これらのツールは JavaScript ビルド パイプラインの一部として、本番環境に設置する前にプログラムのサイズを縮小するためによく使用されます。それらの変換は、ビルド時に関数名を変更することがあります。

次のようなソースコードは、

function Foo() {};
let foo = new Foo();

if (foo.constructor.name === 'Foo') {
  console.log("'foo' は 'Foo' のインスタンスである");
} else {
  console.log('おおっと!');
}

このように圧縮されるかもしれません。

function a() {};
let b = new a();
if (b.constructor.name === 'Foo') {
  console.log("'foo' は 'Foo' のインスタンスである");
} else {
  console.log('おおっと!');
}

非圧縮版では、プログラムは真の方の分岐を実行し、「'foo' は 'Foo' のインスタンスである」と表示するのに対し、圧縮版は異なる振る舞いをし、偽の方の分岐を実行します。それゆえ、上述の例のように Function.name に依存するならば、ビルドパイプラインが関数名を変更しないようにするか、特定の関数名を想定しない構造にする必要があります。

関数文の名前

name プロパティは関数文の名前を返します。

function doSomething() {}
doSomething.name; // "doSomething"
Function コンストラクターの名前

構文 new Function(…) または単に Function(…) で関数を作成すると、Function オブジェクトが作成され、その名前は "anonymous" になります。

D=(new Function).name;	//="anonymous"
無名関数式

function キーワードを使用して生成された関数式またはアロー関数は、名前が "" (空文字列) になっています。

D=(function() {}).name;	//=""
D=(() => {}).name;	//=""
関数名の推測

変数とメソッドは、構文上の位置から無名関数の名前を推論できます(ECMAScript 2015 から)。

let f = function() {};
D=f.name;	//="f"
let object = {
  someMethod: function() {}
};
D=object.someMethod.name;	//="someMethod"

関数式 で名前を持つ関数を定義することができます。

let object = {
  someMethod: function object_someMethod() {}
};
D=object.someMethod.name; //="object_someMethod"

try{
  object_someMethod
}catch(e){
  alert(e);
}
// エラー発生:「ReferenceError: object_someMethod is not defined」

name プロパティは読み取り専用であり、代入演算子で変更することはできません。

let object = {
  // 匿名
  someMethod: function() {}
};

object.someMethod.name = 'otherMethod';
D=object.someMethod.name;	//=someMethod

変更したければ、Object.defineProperty() を使ってください。

¶省く


テスト