У MDN есть огромное страшное предупреждение об изменении прототипа в вашем коде:
Изменение
[[Prototype]]
объекта в силу того, как современные движки JavaScript оптимизируют доступ к свойствам, является очень медленной операцией в каждом браузере и движке JavaScript. Влияние изменения наследования на производительность неуловимо и широко распространено и не ограничивается просто временем, затрачиваемым на операторObject.setPrototypeOf(...)
, но может распространяться на любой код, который имеет доступ к любому объекту,[[Prototype]]
которого был изменен. Если вы заботитесь о производительности, вам следует избегать установки[[Prototype]]
объекта. Вместо этого создайте новый объект с нужным[[Prototype]]
, используяObject.create()
.
Мне интересно, есть ли какие-либо ситуации, когда вы можете изменить прототип объекта, без вызывая каскадные эффекты оптимизации, которые снижают производительность вашей программы. Вроде должно быть. Например, если вы изменяете прототип только сразу после создания объекта (и до его использования кем-либо еще). Но я думаю, что это очень зависит от двигателя.
Итак, кто-нибудь знает, есть ли эффективные способы модификации прототипа объекта?
Изменить: Мотивация для этого вопроса связана с желанием создать объекты, которые на самом деле наследуются от Function
. И единственный известный мне способ сделать это — изменить прототип функции. Смотрите самую нижнюю часть ответа Райноса здесь: класс javascript наследуется от класса Function
Object.assign(Object.create(obj), { obj2, obj3, obj4 })
, который создаст новый объект с прототипами obj. Я полагаю, что это взято из книги Эрика Эллиота. Это обеспечивает лучший объем памяти. Я хотел бы дать вам лучшее определение, но оно как-то связано с тем, что Object.create() на самом деле не создает экземпляр нового объекта, поэтому это быстрее, чем получение прототипов другим способом. Попробуйте поискать в Google что-нибудь вроде производительности памяти Object.create. Я думаю, вы могли бы найти много хорошего материала. - person agm1984   schedule 29.09.2017Function
, без установки прототипа, но установка прототипа все же намного удобнее . И да, если вы изменяете прототип только сразу после создания объекта, действительно должно быть (или: единственным) исключением из этого правила, однако я не могу это доказать. - person Bergi   schedule 29.09.2017