Швидкий фон: У 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()для прототипу об'єкт!
(... яку думку я бачив у багатьох відповідях та коментарях, але це єдиний приклад, який я маю на даний момент.)
Інший варіант - використовувати Object.create(Parent.prototype)як Child.prototype. Наскільки мені відомо, це також створює новий Parentекземпляр, але він не запускає Parentконструктор.
Чи може хтось пояснити, чому слід уникати запуску функції конструктора під час генерації прототипу об'єкта з батьківського типу? Чи існує якась значна технічна проблема, яка виникає (можливо, з кількома рівнями спадкування)? Або така закономірність - це неправильне використання конструкторів, що стикається з якоюсь найкращою прототиповою практикою (наприклад, запуск конструктора при створенні прототипу порушує деяке розділення проблем)?
Object.createреалізовано.