Насколько call()
недействителен, так это то, что Name.fullname
не отображается как функция. Он отображается так же, как и поле, например,
const Name = {
fullname: 'Bob'
};
С такой структурой вы не ожидаете, что сможете вызвать Name.fullname.call
, верно? Но для целей получения значения это то, что предыдущий код был открыт для внешнего мира (разница с полем в том, что вы можете установить значение, тогда как с геттером и без сеттера свойство доступно только для чтения).
get
по существу сообщает движку JavaScript, что всякий раз, когда кто-то запрашивает значение fullname
, передайте им значение свойств fname
и last
, объединенных вместе.
Таким образом, когда вы запрашиваете Name.fullname.call(firstclass_employee[0])
, он сначала находит Name
. Затем он запрашивает значение fullname
. Он возвращает NaN
, потому что this
- это объект Name
, и у него нет свойств fname
или last
, и он пытается принудить первый undefined
(от this.fname
) к Number
для оператора сложения и получает NaN
. Затем он пытается получить функцию call
на NaN
, но этого нет, поэтому он выдает ошибку.
Похоже, вы хотите получить полную имя из любого объекта, имеющего свойства fname
и last
. Я бы предложил использовать для этого метод stati c, а не средство получения свойства экземпляра.
Аналогично, метод stati c будет работать для определения сотрудников, получающих пенсию.
Лично Я бы просто создал class
или серию class
, которые я мог бы составить вместе, чтобы объединить эту функциональность, вместо того, чтобы пытаться использовать call
, но это я.
const Name = {
fullName(obj) {
return `${obj.fname} ${obj.last}`;
}
};
const Pay = {
getsPension(obj) {
return obj.age > 60;
}
}
let firstclass_employee = [{
fname: "sangeth",
last: "AV",
age: 21,
address: {
housename: "good house",
place: "goodplace",
city: "goodtwon",
postcode: 121212
},
hobbies: ["driving", "travelling", "sports"]
}, {
fname: "ramu",
last: "kv",
age: 29,
address: {
housename: "etho veedu",
place: "vayadi",
city: "kalur",
postcode: 11111
},
hobbies: ["travelling", "sports"]
}]
console.log('should be sangeth AV: ', Name.fullName(firstclass_employee[0]));
console.log('should be false: ', Pay.getsPension(firstclass_employee[0]));