Javascript类与对象,优缺点?

Javascript类与对象,优缺点?,javascript,performance,class,memory,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,

在我最新的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};
我猜后一种方法在某种程度上会更有效(不调用类的函数),但它值得吗


我想知道使用类和使用常规对象的优缺点。比如说,类占用的内存会显著增加吗?

就性能而言,添加方法会带来不同。如果使用对象文字,则每个对象都需要为每个方法设置一个字段:

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__: ---/
        }
也就是说,只有当您实例化了很多对象,并且这些对象有许多方法,并且其中许多方法是闭包时,性能差异才会起作用。如果我是你,我会更加强调代码风格问题:例如,使用object literal方法,你可以使用闭包来模拟私有变量,而如果这些方法在共享的公共原型中,那么你的所有实例变量都需要是公共的。

首先,在JavaScript中。那么有什么区别呢

  • 构造函数实例化的对象有一个原型对象,从中继承属性。此原型对象由同一函数构造的所有对象共享。你可以在上面放一些常用的方法,这将是一个很好的例子
  • 调用构造函数。您可以使用它初始化您的对象(填写默认值、验证参数等),并且您有一个范围来构造闭包
即使对于某些不需要原型的对象,函数为您返回普通对象仍然具有优势。至少,它为您提供了更改实现的灵活性,而无需更改代码库中的每个实例化。因此,从一个简单的

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

(您甚至可以使用
new
调用它而不产生任何效果),并在以后需要时对其进行扩展。

当您需要继承原型时,请使用构造函数。当您只需要任务的一组值时,请使用文本。这取决于OOP与过程编程。我建议您始终将可读性和可维护性置于性能之上。如果它清理了您的代码以获得一个类,那么就去做吧。内存中有额外的函数来定义它,还有额外的函数调用来调用它。除非情况极端,否则成本可以忽略不计。感谢您如此迅速地给出了非常有用的答案:)我必须看看在这种情况下我是否能够很好地利用原型,以及使用类是否会使其更具可读性,因为对于一些小对象可能正好相反。也可以在构造函数中添加可能重复的私有变量。谢谢,我想我会对我的大多数对象使用literal方法,除了一些需要有自己函数的较大对象。