在JavaScript中的多个构造函数
我有一个问题:我想知道是否可以模拟多个构造函数,比如在Java中(是的,我知道这些语言完全不同)?
假设我有一个名为“Point”的类,它有两个值“x”和“y”。
现在,假设它是Java版本,我想要两个构造函数:一个接受两个数字,另一个接受一个字符串:
public class Point {
private int x;
private int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public Point(String coord) {
this.x = coord.charAt(0);
this.y = coord.charAt(1);
}
//...
}
//In JavaScript, so far I have
Point = function() {
var x;
var y;
//...
}
是否有可能有两个声明的Point.prototype.init? 是否有可能在JavaScript中有多个构造函数?
您可以通过测试参数的数量或参数的类型在JavaScript中执行此操作。
在这种情况下,你可以通过测试参数的数量来完成它:
function Point(/* x,y | coord */) {
if (arguments.length == 2) {
var x = arguments[0];
var y = arguments[1];
// do something with x and y
} else {
var coord = arguments[0];
// do something with coord
}
}
是的,你可以,但不是你的期望。 由于Javascript是弱类型的,所以没有人关心或检查你提供的参数是什么类型。
Java需要两种不同的构造函数,因为它是强类型的,而且参数类型必须与方法签名相匹配,但JavaScript不是这种情况。
function Point(arg1, arg2) {
if (typeof arg1 === "number" && typeof arg2 === "number") {
// blah
} else if (typeof arg1 === "string" && arguments.length == 1) {
// blah
} else {
throw new Error("Invalid arguments");
}
};
这受到了iOS的启发。
class Point {
constructor() {
this.x = 0; // default value
this.y = 0; // default value
}
static initWithCoor(coor) {
let point = new Point();
point.x = coor.x;
point.y = coor.y;
return point;
}
static initWithXY(x,y) {
let point = new Point();
point.x = x;
point.y = y;
return point;
}
}
就像那样,你可以拥有尽可能多的初始化器,而无需编写大量的if-else。
let p1 = Point.initWithCoor({ x:10, y:20 });
let p2 = Point.initWithXY(10, 20);
链接地址: http://www.djcxy.com/p/51983.html