为什么我会将方法附加到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());
非常感谢任何输入!
答案 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);
}