Я много искал об этом, но я не мог найти прямого ответа на него
Почему мы не можем получить доступ к прототипу свойства/метода объекта, созданного с помощью 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 на консоли, вы найдете следующую структуру:
Однако, если мы используем new
ключевое слово для создания объекта, то мы можем byeBye()
получить доступ к byeBye()
прототипа byeBye()
var Hamley = new Greeting()
console.log(Hamley.byeBye())
Output: Have a good day!
При проверке структуры объекта Hamley в консоли мы получим следующее:
Я сомневаюсь, почему мы не можем получить доступ к прототипу свойства/метода объекта, созданного с использованием Object.create()
но мы можем использовать new
ключевое слово.
Другое сомнение в том, что в случае Object.create()
прототип метода byeBye()
попадает под отдельное свойство в __proto__
называемом " prototype
". Если в случае new
byeBye()
доступна непосредственно под __proto__
.
Примечание. Пожалуйста, проверьте ссылки, чтобы открыть изображения, связанные со вторым сомнением
Спасибо всем, кто отвечает на этот пост!
Объект, который вы передаете 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();
new Greeting
иObject.create(Greeting.prototype)
состоит в том, что конструкторGreeting
не вызывается, но в противном случае возвращаемый объект идентичен, если конструктор не содержит оператораreturn
с выражением.