【问题标题】:Accessor properties and their function names访问器属性及其函数名称
【发布时间】:2017-01-26 03:38:47
【问题描述】:

ECMAScript 6 中的所有函数都将为其 name 属性设置适当的值。那么这些访问器属性的名称(getter 和 setter)呢?

示例(来自Understanding ECMAScript 6 book):

var doSomething = function doSomethingElse() {
    // empty
};

var person = { 
    get firstName() {
        return "Nicholas"
    },
    sayName: function() {
        console.log(this.name);
    }
}

console.log(doSomething.name); // "doSomethingElse"
console.log(person.sayName.name); // "sayName"
console.log(person.firstName.name); // undefined, instead of "get firstName"

你能解释一下为什么person.firstName.name返回undefined吗?

【问题讨论】:

  • 我不相信像其他 functions 这样的 getter 和 setter 有 name 属性。也许是设计目标?为什么要问?

标签: javascript function ecmascript-6 getter


【解决方案1】:

由于person.firstName 是一个getter,因此返回值是getter 返回的值(在您的示例中为"Nicholas"),而不是getter 函数本身,因此您不能以这种方式访问​​它的名称。

为了得到函数的引用,可以使用Object.getOwnPropertyDescriptor

var person = { 
    get firstName() {
        return "Nicholas"
    },
}

var descriptor = Object.getOwnPropertyDescriptor(person, 'firstName');

console.log(descriptor);
console.log(descriptor.get.name);

【讨论】:

    【解决方案2】:

    因为person.firstName === "Nicholas""Nicholas".name 不存在。

    当使用getter 时,您直接访问实际返回的值,就执行它的行所理解的而言,您并没有调用函数,这与尝试相同:

    var obj = { something: 'someValue' };
    console.log(obj.something.name);
    

    这也会返回 undefined。

    【讨论】:

    • 我相信他在问为什么get 函数的name 属性不返回getter 的名称。所有函数都有一个name 属性,可以访问函数的名称。
    • @KeithA 确实如此。我相信我回答正确。如果您尝试访问getter,您将不会获得一个函数本身,您将获得它返回的属性,所以typeof person.firstName === 'string',因此没有属性name,因为它不是我们的函数重新处理。
    【解决方案3】:

    因为person.firstName是返回值的类型,所以string,而string没有属性.name

    person.saynamedoSomethingElse 是函数,具有 .name 属性

    console.log(typeof doSomething); // function
    console.log(typeof person.sayName); // function
    console.log(typeof person.firstName); // string
    

    【讨论】:

      【解决方案4】:

      我认为这是因为name 属性仅适用于函数,不适用于变量

      如果你有代码:

      let var1 = "non function";
      let var2 = {};
      let var3 = function(){};
      let var4 = function hello(){};
      let var5 = class AClass{};
      
      console.log(var1.name); // undefined
      console.log(var2.name); // undefined
      console.log(var3.name); // var3
      console.log(var4.name); // hello
      console.log(var5.name); // AClass
      

      您可以看到var1var2 不是函数或类,而其他它们是并且具有name 属性。

      【讨论】:

      • 您在这里混淆了两件事。变量是值的容器,函数和类是。因此,函数可以分配给变量。您是对的,只有函数具有 name 属性。但是您要演示的是 objectsstrings 没有 name 属性。变量无论如何都没有属性。
      猜你喜欢
      • 2021-12-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-19
      相关资源
      最近更新 更多