Швидкий фон: У 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
реалізовано.