Сообщение от warren buffet
|
Зачем тебе функция как метод, если она фактически constructor?
|
Проблема немного в другом.
Я пытаюсь освоить ООП в JS на боевом примере, и хочется сделать красиво, но не очень выходит.
Я проектирую два (по сути как) класса:
- график (GraphStruct)
- кривая (CurveStruct)
График имеет свои свойства и методы:
function GraphStruct(distCrvs, maxCurveLength, maxCurveHeight, ..., jsonData){
this.mainNumOfPnts = calcAveregeNum(jsonData);
this.numberOfCurves = jsonData.lessons.length;
this.distanceBtwCurves = distCrvs;
this.maxWidth = maxCurveLength;
this.maxHeight = maxCurveHeight;
this.denstyKfcnt = denstyKfcnt;
this.roundKfcnt = roundKfcnt;
this.ratBasToTechKfcnt = ratBasToTechKfcnt;
this.graphObjects = {
curves: [],
axisAndGrids: undefined,
relationships: undefined
};
// рассчитываем параметры всех точек графика исходя из настроек графика
this.calcCurvesParam = function (Data) {
var arr = [];
// пробегаем все кривые описанные в JSON, шлём параметры графика через this
for(var i= 0; Data.lessons[i]; i++){
this.graphObjects.curves.push(new CurveStruct( i, Data.lessons[i]));
}
return arr;
};
function calcAveregeNum (jsonData){
...
}
...
}
Кривая имеет свои свойства и методы:
function CurveStruct(curveNumber, jsonLesson) {
if ( this.__proto__ != graph ) {
inherit(graph, this); } //наследовать свойства графика в кривую
this.curveNumber = curveNumber;
this.numberOfPoints = jsonLesson.test_results.length;
this.midPointNumber = calcMidPoint(this.numberOfPoints);
this.position_x = calcPosX(this);
this.curveObjects = {
lines: [],
planes: [],
points: []
};
// куча методов которые используют значения свойств
// объекта graph, то есть:
// - mainNumOfPnts
// - distanceBtwCurves
// - denstyKfcnt
// - и др...
//
// я хочу их вызывать в конструкторе кривых и его методах
// просто и изящно, на подобие этого (кстати так и вызываю сейчас):
function calcPosX (curve) {
var crvNumber = curve.curveNumber;
var crvAll = curve.numberOfCurves;
var midCurve = Math.floor(crvAll/2);
return curve.distanceBtwCurves * (crvNumber - midCurve));
}
}
Как видите, чтобы в методах кривой я мог использовать свойства графика просто и красиво, я делаю прототипное наследование: указываю прототипом кривой объект графика. У меня получается использовать свойства графика только тогда, когда:
- объект графика инициализирован
Когда он не инициализирован, я получаю в значениях наследуемых параметров
undefined
Логика в том, что по приходу JSON'а я хочу тупо вызовом конструктора графика, сразу же выстроить и сам график и заодно все кривые, которые строятся своим конструктором (данные для графика и кривых лежат в самом JSON). Но сейчас я сначала делаю объект графика, а потом уже рассчитываю все кривые, потому что если вызвать конструктор кривой во время процесса инициализации объекта графика - будет наследование
undefined значений. То есть выглядит это так:
var graph = new GraphStruct(40, 800, 350, 1, 0.82, 9/10, dataInput); // создал график graph
graph.calcCurvesParam(dataInput); // вызвал конструктор кривых и создал кривые в графике graph
А в идеале хотелось бы так:
var graph = new GraphStruct(40, 800, 350, 1, 0.82, 9/10, dataInput);
// без вызова calcCurvesParam(dataInput)
Соответственно вызов конструктора кривой перенести в конструктор графика, как-то так:
function GraphStruct(distCrvs, maxCurveLength, maxCurveHeight, ..., jsonData){
this.mainNumOfPnts = calcAveregeNum(jsonData);
this.numberOfCurves = jsonData.lessons.length;
this.distanceBtwCurves = distCrvs;
this.maxWidth = maxCurveLength;
this.maxHeight = maxCurveHeight;
this.denstyKfcnt = denstyKfcnt;
this.roundKfcnt = roundKfcnt;
this.ratBasToTechKfcnt = ratBasToTechKfcnt;
this.graphObjects = {
// СДЕЛАТЬ КАК-ТО ТАК:
curves: calcCurvesParam(),
axisAndGrids: undefined,
relationships: undefined
};
// соответственно функцию закрыть и не публиковать
function calcCurvesParam () {
var arr = [];
// пробегаем по все кривым описанным в JSON
for(var i= 0; Data.lessons[i]; i++){
arr.push(new CurveStruct( i, Data.lessons[i]));
}
return arr;
}
...
}
Опыта мало, а колхоз хочется разводить по-меньше)
Возможно есть ошибка в архитектуре и это делается всё проще, если есть такой вариант, расскажите пожалуйста