Не удалось извлечь свойство из прототипа функции, возвращающей функцию

#javascript #function #prototype #ecmascript-5

#язык JavaScript #функция #прототип #ecmascript-5

Вопрос:

Приветствие-это простая функция, которая возвращает функцию в качестве вывода.

Мы добавили dev в прототип функции приветствия, чтобы показать имя разработчика.

 function greet() {  function hello(name) {  console.log(`Hello ${name}`);  }  return {hello} }  greet.prototype.dev = "Dev name";  let greetObj = new greet();  console.log(greetObj.dev) // Displays as undefined. 

Я ожидал, что greetObj.dev или любой другой объект, созданный с помощью функции приветствия, отобразит dev свойство, определенное в greet prototype , но вместо этого мы получаем undefined .

Кто-нибудь может, пожалуйста, помочь, где я здесь ошибаюсь?

Комментарии:

1. Если вы собираетесь greet быть конструктором, он не должен ничего возвращать

2. Вы возвращаете совершенно новый объект, который содержит только свойство hello . И вы добавляете dev свойство greet . Оба являются разными объектами и greet не prototype greetObj являются .

3. Спасибо за ваши комментарии. Теперь это имеет смысл.

Ответ №1:

Вам нужно только присвоить значение this функции конструктора. Тебе не обязательно возвращаться anything . JS вернет объект, все свойства которого будут присвоены этому объекту

 function greet() {  function hello(name) {  console.log(`Hello ${name}`);  }  this.hello = hello; }  greet.prototype.dev = "Dev name";  let greetObj = new greet(); console.log(greetObj.dev); 

Best Practice

Но это не лучшая практика для добавления функции в функцию конструктора. Он просто добавит hello функцию ко всем объектам, которые без необходимости создают несколько копий для каждого объекта, чего вам не следует делать.

В идеале вы должны прикрепить эту функцию к ней prototype как:

 function greet() {}  function hello(name) {  console.log(`Hello ${name}`); }  greet.prototype.hello = hello; greet.prototype.dev = "Dev name";  let greetObj = new greet(); console.log(greetObj.dev); greetObj.hello("developer");