javascript – 为什么定义JS原型函数比字典中分别更快?

前端之家收集整理的这篇文章主要介绍了javascript – 为什么定义JS原型函数比字典中分别更快?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
这似乎是一个特别晦涩的一点,但是我正在尝试改进我对 JavaScript语言整体的基础(更具体地说,它是最好和最有效的做法).

http://jsperf.com/测试一个理论时,我想出了一些奇怪的结果:

假设我们有两个“相同”的原型,定义如下:

Object1

var Object1 = function() {}

Object1.prototype.defaults = {
    radius: 400,up: 1
}

Object1.prototype.centerOffset = function() {
    return this.defaults.radius*this.defaults.up;
}

对象2

var Object2 = function() {}

Object2.prototype = {
    defaults: {
        radius: 400,up: 1
    },centerOffset: function() {
        return this.defaults.radius*this.defaults.up;
    }
}

在执行以下简单操作时,Object1与Object2相比具有一致(如果边缘:〜3%)速度优势:

var o = new Object1();
var offset = o.centerOffset();

&安培;

var o = new Object2();
var offset = o.centerOffset();

您可以自己运行测试here.我在OSX 10.6.8上使用Chrome 25.

我想知道的是这样的:

>这个性能差异的原因是什么?
这是否表现为javascript中的一些最佳做法?

先谢谢你们.

编辑:感谢您的反馈 – 正如有些人所提到的,我进一步的测试似乎表明这个问题是浏览器(或者更确切地说,Javascript编译器具体).我已经在Safari,IE 10和Firefox中另外测试过. IE 10和Firefox都给出了非常接近的结果,没有什么不同. Safari执行Object2上的操作比Object1上的操作稍快一些(平均约为2%).我想知道什么是异常值(Other),因为这种情况下的性能差异似乎很大.

解决方法

当你声明一个函数时,它的prototype属性被初始化一个包含默认构造函数的对象.

使用Object1,您将添加一个属性到现有的原型函数.
使用Object2,您将使用自己的构造函数替换现有的原型.

两者不一样.

为什么速度不同?那么,V8可以在每次创建一个实例时为你的object2原型添加一个构造函数.

或者更有可能的是,在机器代码中实现了预先存在的原型功能,使其更快,当您将自己的对象分配给Object2.prototype时,原型函数现在是纯JavaScript,因此更慢.

细节并不那么重要,因为不同的口译员会以这种不同的方式处理,重要的是意识到Object1和Object2不完全一样.

原文链接:https://www.f2er.com/js/155028.html

猜你在找的JavaScript相关文章