如何在JS(Javascript)中重载一个对象的构造函数?

我能做些什么吗?

function User(form) { this._username = form.username.value; this._password = form.password.value; this._surname = form.surname.value; this._lastname = form.lastname.value; this._birthdate = form.b_day.value+"-"+form.b_month.value+"-"+form.b_year.value; this._avatar = form.avatar; this._messages = new Array(); this._messagesCount=0; } function User(userName,password,surname,lastName,birthdate) { this._username = userName; this._password = password; this._surname = surname; this._lastname = lastName; this._birthdate = birthdate; this._avatar = form.avatar; this._messages = new Array(); this._messagesCount=0; } 

你不能这样做,因为JavaScript不是强types语言,它不会在form和userName之间看到区别。 您可以创build多个函数,如createUserFromForm(form)createUserFromUserInfo(userName, password,...)或者您可以尝试使用没有指定参数的单一构造函数,然后使用参数集合来检查input并决定要做什么。

我喜欢Ilya Volodins的回答,我想我会join这个例子:

 function foo() { var evt = window.event || arguments[1] || arguments.callee.caller.arguments[0]; var target = evt.target || evt.srcElement; var options = {}; if (arguments[0]) options = arguments[0]; var default_args = { 'myNumber' : 42, 'myString' : 'Hello', 'myBoolean' : true } for (var index in default_args) { if (typeof options[index] == "undefined") options[index] = default_args[index]; } //Do your thing } //then you call it like this foo(); //or foo({'myString' : 'World'}); //or foo({'myNumber' : 666, 'myString' : 'World', 'myBoolean' : false}); 

有可能更好的做法,但这只是一个例子。

不,你不能,JavaScript不支持任何types的重载。

你可以做的是传递一个已经填充了值的对象到你的构造函数中,然后从对象中获取值,但这是重复的代码。

或者你可以创build一个默认的构造函数,并添加诸如initFromUsersetFromForm ,然后获取相应的参数并设置对象值, new User().initFormForm(form)对我来说看起来相当干净。

通过计算参数的数量来重载构造函数或任何其他的Javascript函数:

 function FooString() { if(arguments.length>0) { this.str=arguments[0]; return; } this.str=""; } var s1=new FooString; var s2=new FooString("hello world"); 

您还可以通过检测缺less多less参数来设置缺省参数。

您可以使用JSONstring和typeof命令的组合轻松地模拟重载的方法和构造函数。 看下面的例子 – 你的val属性来自进入的数据types:

 function test(vals) { this.initialise = function (vals) { if (typeof (vals) == 'undefined') { this.value = 10; } else if (Object.prototype.toString.call(vals) === '[object Array]') { this.value = vals[0]; } else if (typeof (vals) === 'object') { if (vals.hasOwnProperty('x')) { this.value = vals.x; } else if (vals.hasOwnProperty('y')) { this.value = vals.y; } } else { this.value = vals; // eg it might be a string or number } } this.otherMethods = function () { // other methods in the class } this.initialise(vals); } var obj1 = test(); // obj1.val = 10; var obj2 = test([30, 40, 50]); // obj1.val = 30; var obj3 = test({ x: 60, y: 70 }); // obj1.val = 60; var obj4 = test({ y: 80 }); // obj1.val = 80; var obj5 = test('value'); // obj1.val = 'value'; var obj6 = test(90); // obj1.val = 90;