2017-01-26 29 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'屬性。無論如何變量都沒有屬性。 –