【问题标题】:Why is the name property a different value from what I set it to? [duplicate]为什么 name 属性与我设置的值不同? [复制]
【发布时间】:2016-11-19 11:29:45
【问题描述】:

我是 JavaScript 新手。有人能解释一下为什么我在访问 person 函数的 name 属性时会得到一个意外的值吗?

var name = function() {
    console.log('name');
}

function person() {
    console.log('hello person');
}

person.name = "hello";

console.log(person.name); // logs "person"

【问题讨论】:

    标签: javascript


    【解决方案1】:

    函数有一个“名称”属性,默认为函数本身的 erm name。它可以访问但不能写入,因此您对person.name 的分配将被忽略。

    https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Function/name

    【讨论】:

    • 谢谢你的回答 :)
    【解决方案2】:

    Function.name 是为函数定义的不可写和不可枚举的属性。所以即使你

    person.name = "hello";

    它没有被覆盖。它返回函数名。

    【讨论】:

      【解决方案3】:

      在 JavaScript 中,您可以定义只读(writable: false) 属性。因此,name 属性就是其中之一。进一步,您可以查看此链接。

      Defining read-only properties in JavaScript

      Define Property

      【讨论】:

        【解决方案4】:

        检查definePropertydoc

        可以通过赋值运算符定义不可枚举和不可写的属性

        可写

        当且仅当与属性关联的值可能是 用赋值运算符改变。

        可枚举

        当且仅当此属性在枚举 对应对象的属性。

        namefunction 对象的此类属性之一。

        可写

        可枚举

        可配置

        【讨论】:

          【解决方案5】:

          如果你检查name property descriptor 你会发现它是不可写的:

          function person() {
              console.log('hello person');
          }
          
          var descriptor = Object.getOwnPropertyDescriptor(person, 'name');
          
          console.log(descriptor);

          如您所见,它有"writable": false,这意味着您无法更改函数的name

          【讨论】:

          • "不可变" !== 不可写。
          • @torazaburo Ops,当然。谢谢!
          猜你喜欢
          • 2023-04-07
          • 2011-07-24
          • 2015-02-17
          • 1970-01-01
          • 2021-11-24
          • 2012-06-13
          • 1970-01-01
          • 2015-01-30
          • 2013-08-19
          相关资源
          最近更新 更多