#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");