访问器属性及其函数名称

Accessor properties and their function names

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

示例(来自 Understanding ECMAScript 6 书):

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 returns undefined 吗?

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

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

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

哪个 return 也未定义。

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

person.saynamedoSomethingElse 是函数并且有 .name 属性

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

我认为这是因为 属性 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

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

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

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

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

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