JavaScript 两个对象 - 相互覆盖
JavaScript two objects - overriding each other
我正尝试在 JavaScript 中学习面向对象编程。因此,我的做法可能是错误的。
我有一个 JS 函数 (class):
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.
提前致谢。
User.prototype.getEmpId() {
return this.empId;
}
应该是
User.prototype.getEmpId = function () {
return this.empId;
}
每次实例化 User 对象时,User.prototype.getEmpId 都会被覆盖。原型 属性 在所有实例之间共享。
然后怎么办:
User.prototype.getEmpId = function() {
return this.empId;
}
检查这个 fiddle :
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
对象时,您都会在 User.prototype
对象本身上设置 properties/values。相反,您应该在 User
的每个 instances
上设置。以下是有效的更新 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;
}
}
}
希望对理解有所帮助!
我正尝试在 JavaScript 中学习面向对象编程。因此,我的做法可能是错误的。
我有一个 JS 函数 (class):
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.
提前致谢。
User.prototype.getEmpId() {
return this.empId;
}
应该是
User.prototype.getEmpId = function () {
return this.empId;
}
User.prototype.getEmpId 都会被覆盖。原型 属性 在所有实例之间共享。
然后怎么办:
User.prototype.getEmpId = function() {
return this.empId;
}
检查这个 fiddle :
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
对象时,您都会在 User.prototype
对象本身上设置 properties/values。相反,您应该在 User
的每个 instances
上设置。以下是有效的更新 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;
}
}
}
希望对理解有所帮助!