我正在尝试用JavaScript学习面向对象的编程。因此,我在做什么可能是错的。
我有一个JS函数(类):
function User() {
//initiating object code goes here
}
//Functions
User.prototype.getEmpId = function() {
return this.empId;
}
var myUser = new User({'empid':'1'});
console.log(myUser.getEmpId()); //Returns 1
var mynewuser = new User({'empid':'2'});
console.log(myUser.getEmpId()); //Returns 2
console.log(mynewuser.getEmpId()); //Returns 2
我不明白这里出了什么问题。如果这两个是两个不同的对象,那么它为什么会引起问题。我添加了完整的代码here。
提前致谢。
答案 0 :(得分:3)
User.prototype.getEmpId() {
return this.empId;
}
应该是
User.prototype.getEmpId = function () {
return this.empId;
}
答案 1 :(得分:3)
每次实例化User对象时都会覆盖User.prototype.getEmpId。 prototype属性在所有实例之间共享。
然后该怎么做:
User.prototype.getEmpId = function() {
return this.empId;
}
答案 2 :(得分:2)
检查这个小提琴:
http://jsfiddle.net/c5yhpav9/2/
function User(obj) {
//initiating object code goes here
this.empId=obj.empid;
}
//getEmpId now shared for all the instances of User
User.prototype.getEmpId=function() {
return this.empId;
}
var myUser = new User({'empid':'1'});
alert(myUser.getEmpId()); //Returns 1
var mynewuser = new User({'empid':'2'});
alert(myUser.getEmpId()); //Returns 1
alert(mynewuser.getEmpId()); //Returns 2
现在回到您在样本共享中遇到的问题。我发现每次实例化User.prototype
对象时,都会在User
对象上设置属性/值。相反,您应该设置instances
的每个User
。以下是更新后的jsfiddle:
主要变更:
首先,
formUserObjectFromObject.call(this);//calling with reference of this
和
function formUserObjectFromObject() {
//Will only be called for one object.
for (var userKey in arg[0]) {
switch(userKey) {
case "appId":
//Calling setAppId on this to set value of property
this.setAppId(arg[0][userKey]);
break;
case "empId":
this.setEmpId(arg[0][userKey]);
break;
case "firstName":
this.setFirstName(arg[0][userKey]);
break;
case "lastName":
this.setLastName(arg[0][userKey]);
break;
case "roleId":
this.setRoleId(arg[0][userKey]);
break;
case "emailId":
this.setEmailId(arg[0][userKey]);
break;
case "supervisorId":
this.setSupervisorId(arg[0][userKey]);
break;
default:
this.setCustom(userKey, arg[0][userKey]);
break;
}
}
}
希望有助于理解!