【问题标题】:multiple constructor in javascriptjavascript中的多个构造函数
【发布时间】:2011-11-20 20:55:47
【问题描述】:

我有一个问题:我想知道是否可以模拟 多个构造函数,例如在 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


【解决方案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);
        }
        

        【讨论】:

        • Java 的好处在于你可以拥有相同的构造函数名称
        猜你喜欢
        • 2018-10-21
        • 2011-03-14
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-04-11
        • 1970-01-01
        • 2018-06-09
        • 1970-01-01
        相关资源
        最近更新 更多