【问题标题】:Storing data in an array using Javascript Prototypical inheritance使用 Javascript 原型继承将数据存储在数组中
【发布时间】:2015-10-01 15:56:33
【问题描述】:

做一些 javascript 原型继承,我想在我的 Grades constructor 中推送参数并进行存储操作,并使用我的存储方法将数据推送到我的 this.students 数组中,然后在我喜欢的范围内使用这些值我的其他方法。

但问题是,当我在控制台记录构造函数时,它会按照我需要的方式将数据推送到 this.students 数组中,但每个对象都显示为未定义。

这很奇怪,因为如果我在 Grades constructor 内运行 for 循环,它将完美运行。但我想有一个单独的方法来做到这一点,在我的Grades constructor

任何能帮我指出正确方向的帮助都会很棒!谢谢!

function Grades(studentGrades) {

    if(!Array.isArray(studentGrades)) return true;

    this.students = [];
    this.studentGrades = arguments.length;
    this.numRows = 0;
    this.numColumns = 0;

    this.init();
}

/*
* Method to initialize functions
*/
Grades.prototype.init = function() {
    this.storage();
};

/*
* Method to store a list of grades in an array object
*/
Grades.prototype.storage = function() {
    for(var i=0; i < this.studentGrades; i++) {
        this.students.push(this.studentGrades[i]);
    }
};

/*
* Method to add grades
*/
Grades.prototype.addGrades = function(numRows, numColumns, initial) {
    for(this.numRows; this.numRows < this.students.length; this.numRows++ ) {

    }
};

/*
* Method to display the students average
*/
Grades.prototype.display = function() {
    // body...
};


var inputGrades = new Grades( [89,78,93,78], [83,67,93,98], [93,99,73,88] );


console.log(inputGrades);

【问题讨论】:

  • @Teemu 我的论点的长度是 3 在这种情况下 var inputGrades = new Grades( [89,78,93,78], [83,67,93,98], [93, 99,73,88])。就像在函数内部传递对象一样,希望操纵我放在 Grades 函数中的任何 arguments.length 的数据。
  • 你设置this.studentGrades = arguments.length;(即3*),然后你使用this.studentGrades作为一个数字,然后一行你认为它是一个数组??? *) arguments 是一个类似数组的对象,包含传递给函数的参数。
  • @Teemu 很好,如果你 console.log(this.studentGrades) 它的长度是 3
  • @Amechi 呃,我的错,你传递了三个参数......但是this.studentGrades 不能同时是一个数字和一个数组。

标签: javascript arrays function constructor arguments


【解决方案1】:

我认为您的代码存在一些问题,尤其是 Grades 构造函数:

function Grades(studentGrades) {

    if(!Array.isArray(studentGrades)) return true;

    this.students = [];
    this.studentGrades = arguments.length;
    this.numRows = 0;
    this.numColumns = 0;

    this.init();
}

您正在使用数组作为函数的参数,但您正在传递 thtree 参数(数组),我认为这一行:

var inputGrades = new Grades( [89,78,93,78], [83,67,93,98], [93,99,73,88] );

应该是这样的:

var inputGrades = new Grades( [[89,78,93,78], [83,67,93,98], [93,99,73,88] ]);

而下面这行this.studentGrades = arguments.length;在构造函数中是没用的,可能会导致你的代码出现问题,应该换成:

this.studentGrades = arguments;

或者如果你像我一样传递一个数组,你可以使用:

this.studentGrades = studentGrades;

【讨论】:

  • 谢谢! this.studentGrades = arguments 是正确的方法!但是我有一个问题,为什么我不应该在构造函数中使用 this.studentGrades = arguments.length?
  • @Amechi 太好了,很高兴它有帮助。关于你的最后一个问题,如果我们使用arguments.length,我们将得到一个数组长度的数字,如果我们将此数字分配给studentGrades 数组,它的值将是一个数字而不是数组。
【解决方案2】:

您的问题在于您的存储功能,源于定义。

this.studentGrades实际上定义为数组的长度,而不是数组本身。

如果您不存储输入数组或将其通过init(inputGrades) 传递给storage(inputGrades),则您无法从存储原型访问原始输入。

更好:将构造函数位更改为:

this.students = [];
this.studentGrades = studentGrades;

而你的函数存储在:

for(var i=0; i < this.studentGrades.length; i++) {
    this.students.push(this.studentGrades[i]);
}

我认为你应该没事。

更新:您的原始函数调用具有可变数量的参数。 获得完整答案的最简单方法是将参数变量更改为:

var inputGrades = new Grades( [[89,78,93,78], [83,67,93,98], [93,99,73,88]]);

现在你只发送一个参数,一个数组数组。

替代方案:将函数改为

function Grades() { // so no input argument

 if(!Array.isArray(studentGrades)) return true;

  this.students = [];
  this.studentGrades = Array.prototype.slice.call(arguments);
  this.numRows = 0;
  this.numColumns = 0;

然后你应该能够发送多个参数。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-14
    • 2014-05-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-28
    相关资源
    最近更新 更多