Краткая справка: в JavaScript функция конструктора для каждого типа объекта имеет prototype
свойство. prototype
Относится к объекту , который каждый построенный объект использует в качестве следующего шага вверх в своей цепи прототипов. Если вы хотите, чтобы один тип был присущ другому типу, вы можете установить prototype
для дочернего типа новый экземпляр родительского типа.
Например:
var Parent = function() { /* constructor business */ }
Parent.prototype.parentProp = "some parent property";
var Child = function() { /* constructor business */ }
Child.prototype = /*** !! Some prototype object goes here !! ***/
Мой вопрос спрашивает о том, какой код должен идти в " Some prototype object goes here
" месте в приведенном выше коде. Мой первый инстинкт - создать экземпляр родительского объекта (т. Е. new Parent()
), Но в комментарии к ответу « Является ли это безопасным способом копирования одного прототипа объекта в другой? , один пользователь пишет:
Нет, не используйте
new bar()
для объекта-прототипа!
(... это мнение я видел во многих SO-ответах и комментариях, но это единственный пример, который у меня есть на данный момент.)
Другой вариант - использовать Object.create(Parent.prototype)
как Child.prototype
. Насколько я знаю, это также создает новый Parent
экземпляр, но он не запускает Parent
конструктор.
Может кто-нибудь объяснить, почему следует избегать запуска функции конструктора при создании объекта-прототипа из родительского типа? Возникает ли какая-то серьезная техническая проблема (возможно, с несколькими уровнями наследования)? Или такой шаблон является неправильным использованием конструкторов, что противоречит некоторой передовой практике создания прототипа (например, запуск конструктора при создании прототипа нарушает некоторое разделение задач)?
Object.create
это реализовано.