为什么可以';我设置了一个JavaScript函数';谁的名字财产?

为什么可以';我设置了一个JavaScript函数';谁的名字财产?,javascript,function,javascript-objects,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" function abc(){ } 为什么名称属性为空 谢谢名称是一个特殊属性,因为它给出了函数的名称,定义如下:

我正在学习JavaScript,并了解到函数类似于对象,可以设置如下属性:

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

}
为什么名称属性为空


谢谢

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

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

}
在这种情况下,name将返回字符串
“abc”
。此名称无法更改。在您的例子中,函数没有名称,因此为空字符串


因为
名称
是非标准的、不可写的。函数声明和被命名,而您有一个匿名函数表达式,它的
名称

您可能想要一个普通对象:

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

您可能希望使用Prototype(请参阅),或者简单地将“person”转换为如下所示的散列:

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

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

例如:

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

您可以更改name属性

Function.name
属性是可配置的

由于它是可配置的,我们可以更改它的
可写
属性,以便对其进行更改。为此,我们需要使用:

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"

长话短说,你会在JS中找到它。我很惊讶有这么多的答案说你做不到这一点。这是绝对可能的-请看我的回答:谢谢,我知道对象文字,但需要理解为什么我不能实际设置函数的名称属性,
name
length
prototype
不是继承的,而是函数对象自己的属性。要修复MDN:-)使用此示例,您如何通过hello()而不是fn()调用函数?这种方法很有效。