我正在尝试创建一个函数(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");
}
答案 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
属性的函数对象都将允许从函数创建的所有对象共享对象的属性。希望有所帮助。