对象数组会覆盖以前的条目

时间:2014-10-05 21:28:09

标签: javascript arrays object

我正在尝试创建一个函数(getstudentsprompt()用户输入并将其放入students数组中。我遇到的问题是,每次将新的学生对象推入students时,前一个对象都会被写入而不是附加它。有谁知道发生了什么事?

我的代码:

// person object
var person = { firstname: "", lastname: "", email: "" };
function Student(){};
Student.prototype = person;
Student.prototype.sid = "";
Student.prototype.courses = [];
var students = [];




var answer = null;
var k = 0;
function getstudents(answer, students){
    students[k] = new Student();
    students[k].courses = new Array();

    for(var i = 0; i < answer.length; i++) {
        if (i < 4) {
            students[k][i] = answer[i];
        }
        if(i > 3) {
            students[k].courses[i-4] = answer[i];
        }
        if(i === answer.length) {

        }

    }
    k++;
}

function getanswer(string) {
    answer = string;
}




function report1() {
    console.log("Report 1 - Registration Information for Students:");
    console.log();
    console.log("Name               Student ID      Email                   CRS#    Fees    Course List");
    console.log("--------           ----------      -------------           -----   ----    -------------");


    for (var i = 0; i < students.length; i++) {
            console.log(students[i][0] + ' ' + students[i][1] + '          ' + students[i][2] + '     ' + students[i][3] + '        ' + students[i].courses.length + '      ' + "$" + feerates[students[i].courses.length] + '    ' + students[i].courses);
          }

}

do {
    getanswer(prompt("Please enter your first name, last name, student ID, email and courses (seperated by ',')"));
    if(answer !== ""){
        var array = answer.split(',');
        answer = array;
        getstudents(answer, students);
    } else {
        answer = null;
    }

} while(answer !== null );

if(answer === "" || answer === null) {
    report1();
} else {
    console.log("No report to write");
}

2 个答案:

答案 0 :(得分:2)

当您推送新学生时,不是学生被覆盖,而是在您在代码中填充学生对象时被覆盖的对象中的信息。

由于您已将学生的属性放在原型中,因此所有学生共享一组属性。当您设置学生的名字时,您可以为所有学生设置名字,因为该属性位于原型中,对于所有学生对象都是相同的。

在学生实例中为学生创建属性,而不是将其放入原型中:

function Student(){
  this.firstname = '';
  this.lastname = '';
  this.email = '';
  this.sid  = '';
  this.courses = [];
}

var students = [];

...

答案 1 :(得分:1)

您的代码显示您正在努力解决JS中的原型概念。问题是你创建的每个学生都是空的。但是每个学生都会根据他们的实际数据(原型)引用一个对象。当你“改变”一个学生时,你所做的就是改变每个学生分享的原型。

不改变学生,而是改变学生继承的内容。解决方案是将所有数据包含在创建学生的函数中。当您使用this关键字时,每个学生都会获得数据。

每当JS无法在对象上找到属性时,它会搜索另一个对象(如果存在)。如果它无法在该对象上找到该属性,则会搜索另一个对象。继承在JS中起作用,因为有一种方法可以指定JS在找不到属性时将使用的对象。您可以创建一个人的10个实例,它们共享1个对象。虽然10个共享属性,但它们并不是每个都有自己的数据,这是你的错误。

从技术上讲,任何在对象上设置prototype属性的函数对象都将允许从函数创建的所有对象共享对象的属性。希望有所帮助。