2015-10-01 2 views
1

Выполнение некоторого прототипического наследования javascript, я хотел бы нажать аргументы в моем Grades constructor и выполнить манипуляции с хранилищем и вытолкнуть данные внутри моего массива this.students, используя мой метод хранения, а затем использовать как мне нравится, в моих других методах.Хранение данных в массиве с использованием Javascript Прототипическое наследование

Но проблема в том, что когда я консоль регистрирую конструктор, он делает то, что мне нужно, с точки зрения нажатия данных в массиве this.students, но каждый объект появляется как неопределенный.

Это странно, потому что, если я запустил цикл for внутри Grades constructor, он будет работать отлично. Но я хотел бы иметь отдельный метод для этого, внутри внутри моего 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); 
+0

@Teemu, а длина моего аргумента равна 3 в этом случае var inputGrades = new Grades ([89,78,93,78], [83,67,93,98], [93,99,73,88]). Поскольку я просто передаю объекты внутри функции, пытаясь манипулировать данными любых аргументов.length, я помещаю в свою функцию Grades. – Amechi

+1

Вы устанавливаете 'this.studentGrades = arguments.length;' (что равно 3 *), а затем вы используете 'this.studentGrades' как число, а строку позже вы думаете, что это массив ??? *) 'arguments' - объект, похожий на массив, содержащий аргументы, переданные функции. – Teemu

+0

@Teemu хорошо, если вы console.log (this.studentGrades) он выходит на длину 3 – Amechi

ответ

1

Я думаю, что есть некоторые проблемы с вашим кодом, особенно с сортами конструктору:

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] ]); 

И диафрагменное ollowing линия this.studentGrades = arguments.length; бесполезен в конструкторе и может вызвать проблемы в вашем коде, и должны быть заменены:

this.studentGrades = arguments; 

Или, если вы передаете массив массивов, как я сделал вы можете использовать:

this.studentGrades = studentGrades; 
+0

Спасибо! this.studentGrades = аргументы были правильным способом! Но у меня есть вопрос, почему я не должен использовать this.studentGrades = arguments.length внутри конструктора? – Amechi

+0

@Amechi Great, рад, что это помогает. Что касается вашего последнего вопроса, если мы используем 'arguments.length', мы получим число length массива, и если мы присвоим это число массиву' studentGrades', его значение будет числом, а не массивом. –

1

Ваша проблема в вашей функции хранения, исходя из определения.

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]); 
} 

И вы должны быть хорошо, я думаю.

UPDATE: ваш исходный вызов функции имеет переменное количество аргументов. Простейший способ добраться до полного ответа, чтобы изменить переменный аргумент в:

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; 

И тогда вы должны быть в состоянии послать в нескольких аргументов.

+0

Вы правы, отредактированный ответ – wintvelt

Смежные вопросы