JavaScript两个对象 - 相互覆盖

时间:2015-02-06 12:20:20

标签: javascript prototype javascript-objects

我正在尝试用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

提前致谢。

3 个答案:

答案 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:

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

希望有助于理解!