将方法附加到原型或构造函数 - 它们都工作正常,为什么要更好?

时间:2018-04-13 21:52:09

标签: javascript constructor prototype

为什么我会将方法附加到prototype VS. constructor功能?在下面的简单测试代码中,它们被称为相同,并且它们在两个实例中产生相同的结果。我确信每种方法都必须有一个好处,但我不确定它可能是什么。

在第一个文本代码中,我将.totalCost()方法直接附加到构造函数,它在新实例中按预期工作。

"use strict";

function Aircraft(a, b, c) {
    this.manufacturer = a;
    this.numberOfEngines = b;
    this.costPerEngine = c;
    this.totalCost = function() {
        return this.numberOfEngines * this.costPerEngine;
    }
}

let thunderbolt = new Aircraft('Republic', 1, 25000);

console.log(thunderbolt.totalCost());

在下一个测试代码中,我将.totalCost()方法附加到原型,它在新实例中也可以正常工作。

"use strict";

function Aircraft(a, b, c) {
    this.manufacturer = a;
    this.numberOfEngines = b;
    this.costPerEngine = c;
    Aircraft.prototype.totalCost = function() {
        return this.numberOfEngines * this.costPerEngine;
    }
}

let thunderbolt = new Aircraft('Republic', 1, 20000);

console.log(thunderbolt.totalCost());

非常感谢任何输入!

1 个答案:

答案 0 :(得分:3)

通过将方法附加到原型,对象的每个实例都不必存储完全相同的方法,从而减少了内存占用。

由于方法(行为)在实例之间通常不同,因此单个实​​例不需要存储相同的行为。通过将其放在原型上,所有实例都将继承它。

并且,在原型上设置方法时,在构造函数之外执行此操作,否则每个实例将只在一个原型上重新创建相同的方法,导致最后一个方法被完全相同的新方法覆盖

@ExceptionHandler(Exception.class)
public void handleException(HttpServletRequest req, HttpServletResponse resp) throws Exception {
  req.setAttribute("originalUri", req.getRequestURI());
  req.getRequestDispatcher("/error").forward(req, resp);
}