9

在我最近的 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};

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

决定我想了解使用类与使用常规对象的优缺点。例如,类会占用更多的内存吗?

4

2 回答 2

11

在性能方面,不同之处在于添加方法。如果您使用对象字面量,则每个对象都需要为每个方法提供一个字段:

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__: ---/
        }

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

于 2013-10-04T15:38:49.020 回答
3

首先, JavaScript中没有类。那么有什么区别呢?

  • 由构造函数实例化的对象有一个原型对象,它从该原型对象继承属性。此原型对象由同一函数构造的所有对象共享。你可以把常用的方法放在那里,这样会快很多
  • 构造函数被调用。您可以使用它来初始化您的对象(填写默认值、验证参数等),并且您可以构建闭包。

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

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

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

于 2013-10-04T15:58:05.233 回答