3

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

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

为什么名称属性为空?

谢谢

4

6 回答 6

9

因为是函数对象name的非标准、不可写 属性。函数声明和命名函数表达式命名的,而匿名函数表达式是.name""

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

var person = {
    name: "John Smith",
    age: 21,
    profession: "Web Developer"
};
于 2013-09-19T20:36:18.630 回答
5

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

function abc(){

}

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

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

于 2013-09-19T20:36:01.230 回答
2

可以更改名称属性!

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"
于 2017-01-19T06:58:02.223 回答
0

您可能想要使用 Prototype(请参阅JavaScript .prototype 如何工作?)或简单地将“人”转换为哈希,如下所示:

var person = {};
person.name="John Smith"; //output "John Smith"
person.age=21; //output 21
person.profession="Web Developer"; //output "Web Developer"
于 2013-09-19T20:37:36.190 回答
0

您可以使用Object.defineProperty来更改value属性(即使不触摸其writeable标志):

function fn () {}
console.log(fn.name) // Outputs fn

Object.defineProperty(fn, 'name', { value: 'newName' })

console.log(fn.name) // Outputs newName

于 2021-10-06T12:09:48.023 回答
-1

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

例如:

var test = function test() {};
alert(test.name); // Displays "test"
test.name = "test2";
alert(test.name); // Still displays "test"
于 2013-09-19T20:37:49.933 回答