2017-01-26 31 views
0

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返回undefined

+0

我不相信有'为getter和setter像其他[name'属性功能](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name)。也许是设计目标?你为什么要问? –

回答

2

由于person.firstName是一个吸气剂,返回值是无论吸气剂返回("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。

+1

我相信他在问为什么'get'函数的'name'属性没有返回'get'ter的名字。所有函数都有一个'name'属性,可以访问该函数的名称。 –

+0

@凯特A的确。我相信我的回答是正确的。如果你尝试访问getter,你不会自己获得一个函数,你会得到它返回的属性,所以'typeof person.firstName ==='string'',因此没有属性'name '因为这不是我们正在处理的功能。 – GMaiolo

1

因为person.firstName是返回值的类型,所以string和字符串有没有财产.name

person.saynamedoSomethingElse的功能,并有.name财产

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

我认为这是因为财产name只适用于功能,而不是变量es

如果你的代码:

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别人。

+0

你在这里混淆了两件事。变量是*容器的值*,函数和类是*值*。因此可以将函数分配给变量。你是对的,只有函数具有'name'属性。但是你所展示的是* objects *和* strings *没有'name'属性。无论如何变量都没有属性。 –