【发布时间】:2017-09-29 00:38:49
【问题描述】:
MDN 对修改代码中的原型有一个巨大的可怕警告:
改变对象的
[[Prototype]]现代 JavaScript 引擎优化属性访问,非常慢 每个浏览器和 JavaScript 引擎中的操作。对的影响 改变继承的表现是微妙而广泛的,并且是 不仅限于在Object.setPrototypeOf(...)语句中花费的时间, 但可以扩展到任何可以访问任何对象的代码[[Prototype]]已更改。如果你关心性能,你 应避免设置对象的[[Prototype]]。相反,创建一个 具有所需[[Prototype]]的新对象,使用Object.create()。
我想知道是否有任何情况下您可以修改对象的原型而不会导致级联优化效果影响程序的性能。好像应该有。例如,如果您仅在创建对象之后(以及在其被其他任何东西使用之前)修改原型。但我想这非常依赖引擎。
那么有人知道是否有有效的方法来修改对象的原型吗?
编辑:提出这个问题的动机是希望创建实际继承自Function 的对象。我知道如何做到这一点的唯一方法是修改函数的原型。在此处查看 Raynos 答案的最底部:javascript class inherit from Function class
【问题讨论】:
-
你可以使用
Object.assign(Object.create(obj), { obj2, obj3, obj4 })来创建一个带有 obj 原型的新对象。我相信它来自 Eric Elliot 的一本书。它获得了更好的内存占用。我希望我能给你一个更好的定义,但它与 Object.create() 实际上并不实例化一个新对象有关,所以它比从另一种方式获取原型要快。尝试谷歌搜索“Object.create memory performance”之类的内容。我想你可能会找到很多好材料。 -
包括“效率”和“性能”在内的任何问题都应包括用于比较已尝试的各种代码模式的基准;得出基准的代码;以及代码在不同浏览器上的结果。否则,调查是基于纯粹的猜测,肯定有可能给出明确的答案。
-
顺便说一句,那里有is a way to create objects inheriting from
Functionwithout setting the prototype,但是设置原型还是要舒服得多。是的,“如果你只在对象创建后立即修改原型”确实应该是这个规则的一个(或:唯一的)例外,但是我无法证明它。
标签: javascript inheritance prototype prototypal-inheritance prototype-chain