[英]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.