【问题标题】:Why can't I set a JavaScript function's name property?为什么我不能设置 JavaScript 函数的名称属性?
【发布时间】:2013-09-25 02:40:43
【问题描述】:

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

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

为什么 name 属性是空白的?

谢谢

【问题讨论】:

标签: javascript function javascript-objects


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    可以更改 name 属性!

    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"
    

    【讨论】:

    • 使用这个例子,你将如何通过 hello() 而不是 fn() 调用函数?
    【解决方案3】:

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

    例如:

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

    【讨论】:

    • 其实namelengthprototype不是继承的而是拥有函数对象的属性。要修复 MDN :-)
    【解决方案4】:

    您可能想要使用 Prototype(请参阅 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"
    

    【讨论】:

      【解决方案5】:

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

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

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

      【讨论】:

      • 谢谢,我知道对象字面量,但需要了解为什么我不能设置函数的名称属性
      【解决方案6】:

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

      function abc(){
      
      }
      

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-08-21
        • 2021-04-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-17
        相关资源
        最近更新 更多