Поскольку у объектов функций есть свойство name
(которое, между прочим, является нестандартным), которое представляет "имя" функции, ваша функция показывает пустую строку (""
) в качестве значения этого свойства, поскольку это аноним.
Например, если вы объявляете функцию с именем foo
:
function foo() {}
foo.name; // "foo"
var anon = function () {};
anon.name; // "", an anonymous function
var namedFunctionExpr = function bar () {};
namedFunctionExpr.name; // "bar"
Также, как вы заметили, вы не можете изменить значение этого свойства, поскольку в большинстве реализаций оно не конфигурируемо, не перечисляемо и не доступно для записи:
Object.getOwnPropertyDescriptor(function x(){}, 'name');
/* logs:
{
configurable: false,
enumerable: false,
value: "x",
writable: false
}
*/
Помните, что это свойство нестандартное , и есть некоторые реализации, которые не поддерживают его (например, все версии IE JScript не поддерживают его)
Теперь, как предполагает @Felix, я хотел бы добавить, что this.name
не имеет ничего общего со свойством name
вашей функции.
В вашем примере вызов функции obj
в качестве конструктора (с оператором new
) устанавливает значение this
для вновь созданного объекта, который наследуется от прототипа вашей функции, и вы присваиваете значение к свойству name
этого нового объекта.