MDN在关于修改代码中原型的警告中提到:
改变对象的
[[Prototype]]
是一种非常缓慢的操作,因为现代JavaScript引擎优化属性访问的方式决定了这一点,在每个浏览器和JavaScript引擎中都是如此。改变继承的影响是微妙而广泛的,并不仅限于在Object.setPrototypeOf(...)
语句中花费的时间,而可能延伸到任何访问已经被更改[[Prototype]]
的对象的代码中。如果您关心性能,则应避免设置对象的[[Prototype]]
。相反,使用Object.create()
创建具有所需[[Prototype]]
的新对象。
我想知道是否有任何情况下可以修改对象的原型而不会导致级联优化效果影响程序的性能。看起来应该有这样的情况。例如,如果只在对象创建后立即修改原型(并且在任何其他东西使用之前),但我想这非常依赖于引擎。
那么,有没有人知道修改对象原型的有效方法?
编辑:我提出这个问题的动机是想创建实际继承自Function
的对象。而我所知道的唯一方法就是修改函数的原型。请参阅Raynos在这里的答案底部:javascript类继承自Function类
Object.assign(Object.create(obj), { obj2, obj3, obj4 })
来创建一个带有obj原型的新对象。我相信这个方法来自Eric Elliot的一本书。它能够获得更好的内存占用率。我希望能给您提供更好的定义,但它与Object.create()不会实例化一个新对象有关,因此比其他获取原型的方法更快。尝试搜索类似于“Object.create内存性能”的内容,我认为您可能会找到很多好的资料。 - agm1984