【问题标题】:Javascript classes vs objects, pros and cons?Javascript 类与对象,优缺点?
【发布时间】:2013-10-11 16:21:39
【问题描述】:

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

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

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

【问题讨论】:

  • 在需要继承原型时使用构造函数。当您只需要任务的值集合时使用文字。
  • 这取决于 OOP 与过程编程。
  • 我建议始终优先考虑可读性和可维护性而不是性能。如果它清理了你的代码以拥有一个类,那就去吧。您在内存中有额外的函数来定义它,并有额外的函数调用来调用它。除非情况极端,否则成本可以忽略不计。
  • 感谢您这么快提供非常有帮助的答案 :) 我必须看看在这种情况下我是否可以充分利用原型,以及使用类是否会使其更具可读性,因为它可能只是一些小物体则相反。

标签: javascript performance class memory


【解决方案1】:

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

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

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

【讨论】:

  • 构造函数中也可以添加私有变量。
  • 谢谢,我想我会为我的大部分对象使用字面量方法,除了一些需要自己的功能的较大对象。
【解决方案2】:

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

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

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

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

(您甚至可以使用new 调用而没有效果)并在以后需要时对其进行扩展。

【讨论】:

    猜你喜欢
    • 2023-04-09
    • 2015-03-20
    • 2012-03-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 2011-11-03
    • 2011-04-21
    相关资源
    最近更新 更多