Javascript原型使用性能[重复]

Posted

技术标签:

【中文标题】Javascript原型使用性能[重复]【英文标题】:Javascript prototype usage performance [duplicate] 【发布时间】:2013-06-06 23:10:43 【问题描述】:

我想了解使用 javascript 原型的优势。对象原型的使用正在提高性能。 我想通过内存使用来查看这一点。

案例一

    var Foo1 = function (name) 
        this.name = name;
        getFirstName = function()  return "name1"; ;
        getLastName = function()  return "name2"; ;
    ;
    for (var i = 0; i < 1000; i++) 
        var foo1 = new Foo1();
    

案例 2

    var Foo2 = function (name) 
        this.name = name;
    ;

    Foo2.prototype = 
        getFirstName: function ()  return "name1"; ,
        getLastName: function ()  return "name2"; ,
    ;

    for (var i = 0; i < 1000; i++) 
        var foo2 = new Foo2();
    

    哪种情况使用内存多于另一种情况?

    我可以了解案例的内存使用情况吗?

    case的内存使用有什么区别?

【问题讨论】:

这个问题肯定有一些重复。你可以在这里建立自己的测试jsperf.com 性能!== 内存使用情况。 您的第一个案例将创建全局函数而不是对象属性! 【参考方案1】:

如果您将functionobject 定义为属于prototype,则它由所有实例共享,并且使用new 创建对象不会创建它自己的函数/对象实例。从这个意义上说,定义属于原型的东西使用更少的内存。确切的区别在于案例 1(请看下面的 cmets,因为您的定义不正确)会为每个函数创建 1000 个实例。情况 2(再次查看下面的 cmets)将只创建每个函数的 1 个实例。

但是案例 2 没有在原型中定义。您实际上是在重新定义原型。正确的用法是:

function Foo2 (name) 
    this.name = name;
;

Foo2.prototype.getFirstName = function ()  return "name1"; ;
Foo2.prototype.getLastName = function ()  return "name2"; ;

您的案例 1 也没有正确定义您想要实现的目标,因为 getFirstNamegetLastName 不是通过 this(实例)定义的。

【讨论】:

【参考方案2】:

第二种情况更节省内存和性能。当您在构造函数中定义方法时,会为每个对象分配相同的函数或方法,因此该对象会消耗更多内存。所以在原型对象中定义方法,然后所有对象只共享一次相同的方法。

所以我的建议是在构造函数中定义属性(数字、字符串...),在原型对象中定义方法或函数,就像在第二种情况下那样。

顺便说一句,当你这样定义一个对象时:

var Foo1 = function (name) 
    this.name = name;
    getFirstName = function()  return "name1"; ;
    getLastName = function()  return "name2"; ;
;

getFirstName 和 getLastName 方法是 window 的属性,因为你实际上是这样写的:

var Foo1 = function (name) 
    this.name = name;
    window.getFirstName = function()  return "name1"; ;
    window.getLastName = function()  return "name2"; ;
;

【讨论】:

以上是关于Javascript原型使用性能[重复]的主要内容,如果未能解决你的问题,请参考以下文章

高性能 javaScript 之遍历对象属性

高性能javascript学习笔记系列 -算法和流程控制

javascript性能优化

分分钟理解原型模式

JavaScript-big-O性能算法

网站性能优化-Js/Css