我能做点什么吗?:
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;
}
答案 0 :(得分:39)
你不能这样做,因为JavaScript不是强类型语言,它不会看到form和userName之间的区别。您可以创建多个函数,如createUserFromForm(form)
和createUserFromUserInfo(userName, password,...)
,或者您可以尝试使用不指定参数的单数构造函数,然后使用 arguments 集合检查输入并决定输入做。
答案 1 :(得分:21)
我喜欢Ilya Volodins的回答,我想我会加上这个作为例子:
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});
这可能是更好的方法,但这只是一个例子。
答案 2 :(得分:8)
不,你不能,JavaScript不支持任何类型的重载。
您可以做的是将已经填充了值的对象传递给构造函数,然后从对象中获取值,但这会复制代码。
或者您可以创建默认构造函数并添加initFromUser
或setFromForm
等方法,然后获取相应的参数并设置对象值,new User().initFormForm(form)
看起来非常干净。< / p>
答案 3 :(得分:5)
通过计算参数的数量来重载构造函数或任何其他Javascript函数:
function FooString()
{ if(arguments.length>0)
{ this.str=arguments[0];
return;
}
this.str="";
}
var s1=new FooString;
var s2=new FooString("hello world");
您还可以通过检测缺少多少参数来设置默认参数。
答案 4 :(得分:4)
您可以使用以下ES6功能创建构造函数。
class Person {
constructor(name, surname) {
if (typeof name === "object") {
this.name = name.name;
this.surname = name.surname;
} else {
this.name = name;
this.surname = surname;
}
}
}
const person1 = new Person("Rufat", "Gulabli");
const person2 = new Person({ name: "Rufat", surname: "Gulabli" });
const person3 = new Person();
console.log(person1);
console.log(person2);
console.log(person3);
打印输出:
答案 5 :(得分:0)
您可以使用JSON字符串和typeof命令的组合轻松模拟重载方法和构造函数。请参阅下面的示例 - 您的val属性将根据进入的数据类型进行整形:
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; // e.g. 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;