我正在尝试创建一个函数(getstudents),它将prompt()s作为用户输入并将其放入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");
}发布于 2014-10-06 05:59:28
当你推入一个新学生时,被覆盖的不是学生,而是对象中的信息,当你在前面的代码中填充学生对象时,对象中的信息会被覆盖。
由于您已将学生的属性放入原型中,因此所有学生共享一组属性。当您设置一个学生的名字时,您将为所有学生设置名字,因为该属性位于原型中,该原型对所有学生对象都是相同的。
在学生的实例中为学生创建属性,而不是将其放入原型中:
function Student(){
this.firstname = '';
this.lastname = '';
this.email = '';
this.sid = '';
this.courses = [];
}
var students = [];
...发布于 2014-10-06 06:01:34
您的代码显示您正在与JS中的原型概念作斗争。问题是你创建的每个学生都是空的。但是每个学生都引用一个对象作为他们的实际数据(原型)。当你“改变”一个学生时,你所做的就是改变学生的每个实例所共享的原型。
不是改变一个学生,而是改变一个学生继承的东西。解决方案是在构成学生的函数中包含所有数据。在这里,当您使用this关键字时,会为每个学生提供数据。
每当JS在一个对象上找不到属性时,它就会搜索另一个对象(如果存在)。如果它找不到该对象的属性,它会搜索另一个对象。继承在JS中起作用,因为有一种方法可以指定JS在找不到属性时将使用的对象。您可以创建一个person的10个实例,这些实例都共享一个对象。虽然这10个人共享其中一个上的属性,但他们每个人都没有自己的数据,这就是上面的错误。
从技术上讲,任何在对象上设置prototype属性的函数对象都将允许从该函数创建的所有对象共享该对象的属性。希望这能有所帮助。
https://stackoverflow.com/questions/26207410
复制相似问题