Множественный конструктор в 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);
}