javascript中的多个构造函数

Posted

技术标签:

【中文标题】javascript中的多个构造函数【英文标题】:multiple constructor in javascript 【发布时间】: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 中甚至可以有多个构造函数吗?

【问题讨论】:

不可能。不过,您可能会在这个问题的答案中发现一些有用的东西:***.com/questions/456177/… JavaScript pattern for multiple constructors的可能重复 javascript: different constructors for same type of object 或(旧)***.com/questions/3220721/… 的可能重复 【参考方案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 的好处在于你可以拥有相同的构造函数名称

以上是关于javascript中的多个构造函数的主要内容,如果未能解决你的问题,请参考以下文章

多个构造函数的 JavaScript 模式

JavaScript - 从多个数组填充对象构造函数

JavaScript中的构造函数

JavaScript的面向对象

JavaScript中的普通函数与构造函数比较

JavaScript中的构造函数