Почему я не могу установить свойство имени функции JavaScript?

Я изучаю JavaScript и читал, что функции похожи на объекты и могут иметь такие свойства:

var person = function(){
}
person.name="John Smith"; //output ""
person.age=21; //output 21
person.profession="Web Developer"; //output "Web Developer"

Почему свойство name пустое?

Спасибо


person Andy    schedule 19.09.2013    source источник
comment
Короче говоря, это одна из тех причудливых вещей. вы найдете в JS.   -  person Brian    schedule 20.09.2013
comment
Я поражен, что так много ответов говорят, что вы не можете этого сделать. Это определенно возможно - см. мой ответ: stackoverflow.com/a/41735602/993683   -  person    schedule 19.01.2017


Ответы (5)


Поскольку name является нестандартным, недоступным для записи свойство функциональных объектов. Объявления функций и выражения именованных функций являются именованными, а у вас есть выражение анонимной функции, name которого равно "". .

Вы, вероятно, хотели простой объект:

var person = {
    name: "John Smith",
    age: 21,
    profession: "Web Developer"
};
person Bergi    schedule 19.09.2013
comment
Спасибо, я знаю о литералах объектов, но мне нужно было понять, почему я не могу установить свойство имени функции. - person Andy; 20.09.2013

name — это специальное свойство, потому что оно дает имя функции, если определено следующим образом:

function abc(){

}

В этом случае имя вернет строку "abc". Это имя нельзя изменить. В вашем случае у функции нет имени, следовательно, пустая строка.

http://jsfiddle.net/8xM7G/1/

person James Montagne    schedule 19.09.2013

Вы можете изменить свойство name!

Свойство Function.name — это configurable как подробно описано на MDN< /а>.

Поскольку его можно настраивать, мы можем изменить его свойство writable, чтобы его можно было изменить. Для этого нам нужно использовать defineProperty. :

var fn = function(){};
Object.defineProperty(fn, "name", {writable:true});
// now you can treat it like a normal property:
fn.name = "hello";
console.log(fn.name); // outputs "hello"
person Community    schedule 19.01.2017
comment
Используя этот пример, как бы вы вызвали функцию с помощью hello() вместо fn()? - person regularjoe; 19.09.2017
comment
Этот подход работает. - person Binyamin; 29.12.2020

Вы можете использовать Prototype (см. Как работает JavaScript .prototype?) или просто превратите «человека» в хэш следующим образом:

var person = {};
person.name="John Smith"; //output "John Smith"
person.age=21; //output 21
person.profession="Web Developer"; //output "Web Developer"
person Tristan Cebulla    schedule 19.09.2013

Свойство name задается конструктором функции и не может быть перезаписано напрямую. Если функция объявлена ​​анонимной, она будет установлена ​​в пустую строку.

Например:

var test = function test() {};
alert(test.name); // Displays "test"
test.name = "test2";
alert(test.name); // Still displays "test"
person nullability    schedule 19.09.2013
comment
На самом деле, name, length и prototype не наследуются, а владеют свойствами функционального объекта. Собираюсь исправить MDN :-) - person Bergi; 20.09.2013