JavaScript: 对象字面量和对象构造函数有什么区别?

3

我正在学习Codeacademy,他们展示了如何编写两种方式。但是他们没有解释为什么你需要两种方式。


https://dev59.com/KW445IYBdhLWcg3wcJ6O,https://dev59.com/FmYq5IYBdhLWcg3wwDNA - nicosantangelo
2个回答

6

构造函数为对象赋予了身份感。它本质上是一个创建对象的蓝图,可以重复使用。在经典面向对象编程中,它非常类似于类并且经常被混淆。

如果您经常有一堆“汽车”对象,并且有些方法或属性通常适用于所有汽车,则可以创建一个汽车构造函数来帮助封装它。

function Car(numPassengers) {
  this.numPassengers = numPassengers;
}

Car.prototype = {
    accelerate: function () {
      // blah
    },
    brake: function () {
      // blah
    }
};

var jetta = new Car(4);
var bmwZ4 = new Car(2);

对象字面量是一种传递即时对象的方式,它的结构和创建不需要重复使用。与经典 OOP 相比较,类似于 Java 中的 Map(除了 JavaScript 对象字面量仍然可以具有方法)。一个常见的用例是一个函数,它可以接受许多可能的参数,但每个参数都是可选的。

function someActionThatTakesOptionalParams(options) {
  if (options.doAlert) {
    alert(options.doAlert);
  }
  if (options.someOtherProperty) {
    // do some work
  }
}

someActionThatTakesOptionalParams({
  doAlert: 'this will show up in an alert box',
  someOtherProperty: 5,
  hello: 'world'
});

这也是一种方便的方式,只需对传递给其他内容的数据进行建模而不附加方法。例如,您有一个接受JSON的API:

$.ajax({
  url: 'someApiEndpoint',
  method: 'get',
  params: {
    x: 5,
    y: 10
  }
});

0

这不是一个愚蠢的问题。实际上,对象构造函数和特别是数组构造函数可能会很棘手,因为它们使用不同的参数和语义,这可能会导致你遇到微妙的错误。

推荐的方法是使用字面量{}[]

MDN说:

> new Array(element0, element1, ..., elementN)
> new Array(arrayLength)

第一句话构建了一个数组,并将每个参数推入其中。 第二句话构建了一个长度为arrayLength的数组。 如果您尝试构建并推入一个只包含整数的单元素数组会发生什么?小心!

我认为用户更关心为什么有两种不同的创建对象的方式... - Menelaos

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接