2017-01-26 2 views
0

Все функции в ECMAScript 6 будут иметь соответствующее значение для их свойства имени. А как насчет этих имен для свойств доступа (getters и seters)?Свойства аксессуаров и их имена функций

Пример (из книги 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

Я не верю, что есть 'name' свойство для получения и установки, как другие [ функции] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Function/name). Может быть, цель дизайна? Почему вы спрашиваете? –

ответ

2

С person.firstName является получателем, возвращаемое значение - это то, что возвращает получатель ("Nicholas" в вашем примере), а не сама функция геттера, поэтому вы не можете получить доступ к ее имени таким образом.

Для того, чтобы получить ссылку на эту функцию, вы можете использовать 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); 

Что будет return undefined также.

+1

Я верю, что он спрашивает, почему свойство 'name' функции' get' не возвращает имя 'get'ter. Все функции имеют свойство 'name', которое может получить доступ к имени функции. –

+0

@KeithA Действительно. Кажется, я правильно ответил. Если вы попытаетесь получить доступ к получателю, вы не получите функцию самостоятельно, вы получите возвращаемое им свойство, поэтому 'typeof person.firstName === 'string'', поэтому у вас нет свойства' name 'потому что это не функция, с которой мы справляемся. – GMaiolo

1

потому person.firstName тип возвращаемого значения, так string, и строка не имеет свойство .name

person.sayname и doSomethingElse являются функциями и имеют .name свойство

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

Я думаю, это потому, имущество name предназначено только для функции или классы, не для variabl 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 

Вы можете увидеть var1 и var2 не являются функциями или классы и другие они и обладают свойством name.

+0

Здесь вы объединяете две вещи. Переменные - это * контейнеры для значений *, а функции и классы - значения *. Поэтому функции могут быть назначены переменным.Вы правы, что только функции имеют свойство 'name'. Но вы демонстрируете, что * объекты * и * строки * не имеют свойства 'name'. В любом случае переменные не имеют свойств. –

Смежные вопросы