繁体   English   中英

对象数组不断覆盖先前的条目

[英]Array of objects keeps overwriting previous entries

我正在尝试制作一个函数( getstudents )来prompt()用户输入,并将其放入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");
}

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

将学生的属性放到原型中后,所有学生共享一组属性。 设置学生的名字时,将为所有学生设置名字,因为该属性在原型中,对于所有学生对象都是相同的。

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

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

var students = [];

...

您的代码表明,您正在为JS中的原型概念而苦苦挣扎。 问题是您正在创建的每个学生都是空的。 但是每个学生都使用一个对象作为他们的实际数据(原型)。 当您“更改”学生时,您要做的就是更改每个学生实例共享的原型。

无需更改学生,您可以更改学生的继承来源。 解决方案是将所有数据包含在构成学生功能的内部。 使用this关键字时,会为每个学生提供数据。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM