我正在学习 JavaScript 并读到函数就像对象一样,可以像这样设置属性:
var person = function(){
}
person.name="John Smith"; //output ""
person.age=21; //output 21
person.profession="Web Developer"; //output "Web Developer"
为什么名称属性为空?
谢谢
我正在学习 JavaScript 并读到函数就像对象一样,可以像这样设置属性:
var person = function(){
}
person.name="John Smith"; //output ""
person.age=21; //output 21
person.profession="Web Developer"; //output "Web Developer"
为什么名称属性为空?
谢谢
name
是一个特殊属性,因为它在定义如下时给出了函数的名称:
function abc(){
}
在这种情况下,名称将返回字符串"abc"
。此名称无法更改。在您的情况下,该函数没有名称,因此是空字符串。
您可以更改名称属性!
该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"
您可能想要使用 Prototype(请参阅JavaScript .prototype 如何工作?)或简单地将“人”转换为哈希,如下所示:
var person = {};
person.name="John Smith"; //output "John Smith"
person.age=21; //output 21
person.profession="Web Developer"; //output "Web Developer"
您可以使用Object.defineProperty
来更改value
属性(即使不触摸其writeable
标志):
function fn () {}
console.log(fn.name) // Outputs fn
Object.defineProperty(fn, 'name', { value: 'newName' })
console.log(fn.name) // Outputs newName
该name
属性由 Function 构造函数设置,不能直接覆盖。如果函数被声明为匿名的,它将被设置为一个空字符串。
例如:
var test = function test() {};
alert(test.name); // Displays "test"
test.name = "test2";
alert(test.name); // Still displays "test"