2013-09-19 2 views
2

Я учусь JavaScript и читать, что функции как объекты и могут иметь свойства, заданные следующим образом:Почему я не могу установить свойство имени функции JavaScript?

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

Почему это свойство имя пустым?

Благодаря

+2

Короче говоря, это [один из тех необычных вещей] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/ Global_Objects/Function/name) вы найдете в JS. – Brian

+0

Я удивлен, что есть так много ответов, говорящих, что вы не можете этого сделать. Это определенно возможно - см. Мой ответ: http://stackoverflow.com/a/41735602/993683 – JoeRocc

ответ

8

Поскольку name является нестандартным, незаписываемыйproperty of function objects. Объявление функций и named function expressions: с именем, а у вас есть анонимное выражение функции, name - "".

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

var person = { 
    name: "John Smith", 
    age: 21, 
    profession: "Web Developer" 
}; 
+0

Спасибо, я знаю об объектных литералах, но мне нужно понять, почему я не мог установить свойство имени функции – Andy

6

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

function abc(){ 

} 

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

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

0

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

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

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

Например:

var test = function test() {}; 
alert(test.name); // Displays "test" 
test.name = "test2"; 
alert(test.name); // Still displays "test" 
+0

Собственно, 'name', 'length' и' prototype' не наследуются, а являются собственными свойствами объекта функции. Собираем исправление MDN :-) – Bergi

0

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

Недвижимость Function.name Недвижимость configurableas detailed on 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" 
+0

Используя этот пример, как вы могли бы назвать функцию hello() вместо fn()? – regularjoe

Смежные вопросы