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中的多个构造函数的主要内容,如果未能解决你的问题,请参考以下文章