给定一个类,有两种常用的方法来定义它的方法。
在类构造函数中定义方法:
function Calculator() {
this.sum = function (a, b) {
return a + b
}
}
或在类原型中定义方法:
function Calculator() {}
Calculator.prototype.sum = function (a, b) {
return a + b
}
当类实例调用该方法时,这两种方法都会产生相同的结果:
const calc = new Calculator()
calc.sum(1, 2) // 3
-
在第一种方法中,每次创建类的新实例时都必须创建该方法。另一方面,第二种方法创建一次方法,并为类的所有实例共享该方法。也就是说,第二种方法比第一种更有效,需要的内存更少。
-
通过
prototype
创建的方法可以被子类扩展和重写。
第一种方法可以创建一个由其他函数的逻辑组成的巨大构造函数。
考虑下面的巨大构造函数:
function Foo() {
this.bigFunction = function () {
// 这里有一个很大的功能
}
this.anotherBigFunction = function () {
// ...
}
}
对比:
function Foo() {}
Foo.prototype.bigFunction = function () {
// ...
}
Foo.prototype.anotherBigFunction = function () {
// ...
}
后者看起来更具可读性和方便性。