Множественный конструктор в javascript
У меня есть вопрос: мне было интересно, можно ли моделировать
несколько конструкторов, как в Java (да, я знаю, что языки
совершенно разные)?
Скажем, что у меня есть класс под названием "Точка", который имел бы два
значения "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 несколько конструкторов?
Ответы
Ответ 1
Вы можете сделать это в 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
}
}
Ответ 2
Да, вы можете, хотя и не так, как ожидаете. Поскольку 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");
}
};
Ответ 3
Это вдохновлено 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);
Ответ 4
Просто создайте один конструктор другим:
function Point(x,y) {
//make the point and do what the constructor is designed to do
}
function PointStr(str) {
var xp = arguments[0];
var yp = arguments[1];
return new Point(xp, yp);
}