call () не работает с геттером и сеттером в javascript - PullRequest
0 голосов
/ 29 мая 2020

let Name = {
   get fullname() {
        return this.fname + this.last
    }
}

function pension() {
    return this.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(" objects::\t", Name, "\n", firstclass_employee)
    //calling a out side function for an object(out side function may be inside an object oe not)
console.log("Fullname of first employee::", Name.fullname.call(firstclass_employee[0]))
console.log("Pension status of of first emlpoyee::", pension.call(firstclass_employee[0]))
console.log("Fullname of 2nd employee::", Name.fullname.call(firstclass_employee[1]))
console.log("Pension status of of 2nd emlpoyee::", pension.call(firstclass_employee[1]))

И появляется ошибка ---> console.log («Полное имя первого сотрудника ::», Name.fullname.call (firstclass_employee [0])) ^

TypeError: Name.fullname.call не является функцией

Ответы [ 3 ]

0 голосов
/ 29 мая 2020

Если вам нужна обычная функция, удалите get, и все будет нормально. Извините, я ошибочно сказал, что у вас есть ошибки в части console.log().

let Name = {
  fullname() {
       return this.fname + this.last
   }
}

function pension() {
   return this.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(" objects::\t", Name, "\n", firstclass_employee)
//calling a out side function for an object(out side function may be inside an object oe not)
console.log("Fullname of first employee::", Name.fullname.call(firstclass_employee[0]))
console.log("Pension status of of first emlpoyee::", pension.call(firstclass_employee[0]))
console.log("Fullname of 2nd employee::", Name.fullname.call(firstclass_employee[1]))
console.log("Pension status of of 2nd emlpoyee::", pension.call(firstclass_employee[1]))
0 голосов
/ 29 мая 2020

Насколько 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]));
0 голосов
/ 29 мая 2020

удалить get - здесь не действует

let Name = {
   fullname() {
        return this.fname + this.last
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...