gpt4 book ai didi

javascript - 在 Javascript 中向对象原型(prototype)添加许多函数时出现性能问题?

转载 作者:行者123 更新时间:2023-11-29 18:33:21 26 4
gpt4 key购买 nike

我目前正在为许多不同的 Javascript 对象编写一个扩展方法库。例如,如果我向同一源文件中的不同对象(通过它们的原型(prototype))添加 200 多个方法,是否有任何性能考虑因素?

编辑:仅供引用,我正在扩展内置对象。

最佳答案

不会,几乎不会影响性能。即使将函数附加到原型(prototype)也只需要几毫秒(可能是 5 毫秒),超过 200 个函数在内存中的一个位置,永远不会被复制,你永远不会注意到任何东西。当然,假设您附加到某物的 .prototype。

至于为什么没有速度命中:为了解析对象上的函数调用:foo.doSomething(),内部引擎需要遍历对象作用域和原型(prototype)链目的。基本上,它是这样做的:

  • if(Object.hasOwnProperty('doSomething')){//运行 Object.doSomething
  • if(Object.__proto__.hasOwnProperty('doSomething')){//运行 Object.__proto__.doSomething
  • while(Object.__proto__.__proto__.__proto__......){//重复

每一层都是一个散列,所以查找是常数时间。 就查找速度而言,原型(prototype)链中有 2 或 200 万个函数并不重要(尽管如果有 200 万个函数,您将消耗大量内存)。

供引用:jQuery 内部有 511 个函数。 200 根本不算多

旁注:不要扩展 Object.prototype —— 只是不要。如果您这样做,您会破坏 for-in 循环,或者如果人们不使用显式 if(obj.hasOwnProperty(foo)) 检查,至少非常接近于破坏它们。您还将使对象散列上的 for-in 循环变慢,这是您在扩展原型(prototype)时遇到的唯一可能变慢的情况。

请不要扩展Array.prototype——这让我很烦。但是很多其他人都这样做,所以它并没有那么糟糕......争论的焦点是你不应该在数组上使用 for-in 循环,现在很多人都不这样做因为 Prototype.js,但如果你愿意,你仍然应该被允许!

关于javascript - 在 Javascript 中向对象原型(prototype)添加许多函数时出现性能问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573018/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com