在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

上一篇: multiple constructor in javascript

下一篇: How can implement overloading in JavaScript/jQuery?