Javascript类vs对象,优点和缺点?

时间:2013-10-04 15:29:58

标签: javascript performance class memory

在我最近的javascript程序中(主要是为了娱乐和概念验证而不是其他任何东西)我有很多不同类型的对象,每种类型我都有相当数量的“实例”。所以我想我应该使用这些类,但是因为它们非常简单,我可以直接构造它们而不是使用类...

我的意思是:

//I'm making a "car" object that has the properties model, miles, value and color
//using a class like:
function car (model, miles, value, color) { .... }
//so I'd create a new car by using:
mycar = new car(model, miles, value, color);

//However for an object so simple I could also do:
mycar = {model: model, miles: miles, value: value, color: color};

我猜测后一种方法在某种程度上会更有效(没有调用类的函数),但值得吗?

决定我想知道使用类与使用常规对象的利弊。例如,类会占用更多的内存吗?

2 个答案:

答案 0 :(得分:3)

就性能而言,添加方法时会出现差异。如果使用对象文字,则每个对象都需要为每个方法都有一个字段:

obj1--> { x: 10,
          f1: method1,
          f2: method2 }

obj2--> { x: 17,
          f1: method1,
          f2: method2 }

使用类,您可以共享共享原型背后的公共属性:

obj1--> { x:10,
          __proto__: --------> { f1: method1,
         }              /---->   f2: method2 }
                        |
obj2--> { x:17,         |
          __proto__: ---/
        }

也就是说,如果您实例化一个 lot 对象并且这些对象有很多方法,并且其中许多方法都是闭包,那么性能差异只会很重要。如果我是你,我会更加强调代码样式问题:例如,使用对象文字方法,您可以使用闭包来模拟私有变量,而如果方法在共享公共原型中,则所有实例变量都需要公开

答案 1 :(得分:1)

首先,JavaScript中的there are no classes。那有什么区别?

  • 由构造函数实例化的对象具有一个原型对象,从该对象继承属性。该原型对象由同一函数构造的所有对象共享。您可以在其中放置常用方法,即considerably faster
  • 调用构造函数。您可以使用它来初始化您的对象(填写默认值,验证参数等),并且您有一个构造闭包的范围。

即使某些对象不需要原型,返回普通对象的函数仍然有优势。至少,它为您提供了更改实现的灵活性,而无需更改代码库中的每个实例。因此,从简单的

开始
function Car (model, miles, value, color) {
    return {model: model, miles: miles, value: value, color: color};
}

(您甚至可以在没有效果的情况下使用new调用)并在以后需要时将其扩展。