Object.create против нового с точки зрения наследования прототипа

1

Я много искал об этом, но я не мог найти прямого ответа на него

Почему мы не можем получить доступ к прототипу свойства/метода объекта, созданного с помощью Object.create() но мы можем использовать new ключевое слово?

Рассмотрим конструкторную функцию Greeting следующим образом:

function Greeting() {   
}
Greeting.prototype.byeBye = function(){
    console.log("Have a good day!")
}

Теперь я создаю объект из этого конструктора, используя Object.create()

var Stanley = Object.create(Greeting)
console.log(Stanley.byeBye())

Output -  Error: Stanley.byeBye is not a function

Что означает, byeBye() функция byeBye() недоступна напрямую, используя объект Stanley

Если вы проверяете объект Stanley на консоли, вы найдете следующую структуру:

Изображение 174551

Однако, если мы используем new ключевое слово для создания объекта, то мы можем byeBye() получить доступ к byeBye() прототипа byeBye()

var Hamley = new Greeting()
console.log(Hamley.byeBye())

Output: Have a good day!

При проверке структуры объекта Hamley в консоли мы получим следующее:

Изображение 174551

Я сомневаюсь, почему мы не можем получить доступ к прототипу свойства/метода объекта, созданного с использованием Object.create() но мы можем использовать new ключевое слово.

Другое сомнение в том, что в случае Object.create() прототип метода byeBye() попадает под отдельное свойство в __proto__ называемом " prototype ". Если в случае new byeBye() доступна непосредственно под __proto__.

Примечание. Пожалуйста, проверьте ссылки, чтобы открыть изображения, связанные со вторым сомнением

Спасибо всем, кто отвечает на этот пост!

Теги:
prototype
prototypal-inheritance

1 ответ

2

Объект, который вы передаете Object.create должен быть прототипом, Object.create должен обладать новый объект. Вы передаете функцию конструктора, чтобы сделать конструктор прототипом объекта. Вы, вероятно, хотели использовать тот же самый new объект, который использовался бы в свойстве prototype конструктора.

Поэтому вместо:

var Stanley = Object.create(Greeting)

ты хочешь

var Stanley = Object.create(Greeting.prototype)
// ---------------------------------^^^^^^^^^^

Живой пример:

function Greeting() {   
}
Greeting.prototype.byeBye = function(){
    console.log("Have a good day!");
}

var Stanley = Object.create(Greeting.prototype);
Stanley.byeBye();
  • 1
    Просто полезная заметка, единственное различие между вызовом new Greeting и Object.create(Greeting.prototype) состоит в том, что конструктор Greeting не вызывается, но в противном случае возвращаемый объект идентичен, если конструктор не содержит оператора return с выражением.
  • 1
    @PatrickRoberts: Действительно, в частности, если конструктор не возвращает объект (возвращение примитива или нуля игнорируется).
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню