Object.create против нового с точки зрения наследования прототипа - PullRequest
0 голосов
/ 28 апреля 2018

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

Почему мы не можем получить доступ к свойству / методу прототипа объекта, созданного с помощью 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() нельзя получить доступ напрямую, используя Stanley object

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

enter image description here

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

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

Output: Have a good day!

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

enter image description here

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

Другое сомнение заключается в том, что в случае Object.create() метод-прототип byeBye() получает отдельное свойство в __proto__, которое называется 'prototype'. Принимая во внимание, что в случае new, функция byeBye() доступна непосредственно под __proto__.

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

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

1 Ответ

0 голосов
/ 28 апреля 2018

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

Так что вместо:

var Stanley = Object.create(Greeting)

хочешь

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

Live Пример:

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

var Stanley = Object.create(Greeting.prototype);
Stanley.byeBye();
...