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:

http://jsfiddle.net/L3qs4eg7/

完成的主要更改:

首先,

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;
        }
    }
}

希望对理解有所帮助!