为什么我不能设置JavaScript函数的名称属性?

时间:2013-09-19 20:33:14

标签: javascript function javascript-objects

我正在学习JavaScript并读取函数就像对象一样,并且可以设置如下属性:

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

为什么name属性为空?

由于

5 个答案:

答案 0 :(得分:8)

因为name是非标准的,不可写的 property of function objects。函数声明和named function expressions 命名为,而你有一个name""的匿名函数表达式。

你可能想要一个普通的对象:

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

答案 1 :(得分:6)

name是一个特殊属性,因为它在定义时给出了函数的名称:

function abc(){

}

在这种情况下,name会返回字符串"abc"。此名称无法更改。在您的情况下,该函数没有名称,因此为空字符串。

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

答案 2 :(得分:0)

你可能想要使用Prototype(参见How does JavaScript .prototype work?)或者只是将'person'变成这样的哈希:

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

答案 3 :(得分:0)

name属性由Function构造函数设置,不能直接覆盖。如果函数声明为匿名,则将其设置为空字符串。

例如:

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

答案 4 :(得分:0)

可以更改名称属性!

Function.name属性为configurable as 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"