Краткая справка: в 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
это реализовано.Object.create
не работает в IE8» - это просто бесполезный комментарий, когда вы можете реализовать его для этого варианта использования за 2 секунды в любом браузере.Теперь, когда мое понимание немного расширилось, я хотел бы основываться на ответе Эсайлии на конкретном примере:
Особое беспокойство вызывает то, что конструктор может устанавливать специфичные для экземпляра свойства. Таким образом, если вы используете объект-прототип, созданный с помощью
new
, все ваши дочерние экземпляры могут совместно использовать одно определяемое конструктором свойство экземпляра из прототипа.Например, предположим, что
Parent
каждый экземпляр имеет уникальноеid
свойство, установленное как время создания:Это заставит все
Child
экземпляры совместно использовать одноid
свойство прототипа, унаследованное от одного и того жеnew Parent()
объекта, используемого какChild.prototype
.Лучшим подходом для этого случая является использование
Object.create
и непосредственный вызов родительского конструктора (при необходимости) внутри дочернего конструктора:источник