Я думаю, что, возможно, нужно подчеркнуть, что в JavaScript вам нужно определить функции объекта (или методы, если вы предпочитаете этот термин) , прежде чем вызывать их .
Например, если вы хотите вызвать this.func1()
при создании экземпляра:
var new_object = new newObj(); // create/instantiate an object
function newObj(){
this.v1 = 10;
this.v2 = 20;
this.func1(); // <-- calling it here causes an error
this.func1 = function(){ ....};
this.func2 = function(){ ....};
this.func3 = function(){ ....};
}
TypeError: this.func1 не является функцией
Это проблема, с которой я столкнулся много лет назад, пытаясь понять, как сделать ООП в JS. Потому что в других языках, таких как Java или PHP, у вас есть функция / метод конструктора, обычно в верхней части вашего класса, а под вами пишутся другие ваши функции / методы.
Таким образом, было бы логично написать ваш класс таким образом: 1) определить свойства вашего объекта, а затем 2) перечислить действия, которые вы хотите сделать при создании экземпляра объекта, а затем 3) перечислить другие функции / методы класса.
НО НЕТ !!
В JavaScript вы должны определить функции объекта, прежде чем вызывать их .
Итак, если вы хотите вызвать два метода для создания / создания объекта, скажем, this.func1()
и this.func2()
, сначала определите все в вашем классе и в конце сделайте вызовы вашего метода:
var new_object = new newObj(); // create/instantiate an object
function newObj(){
this.v1 = 10;
this.v2 = 20;
this.func1 = function(){ ....};
this.func2 = function(){ ....};
this.func3 = function(){ ....};
this.func1(); // <-- it works here!
this.func2(); // <-- it works here!
}
Если вы хотите, чтобы ваш код был организован с помощью метода конструктора, расположенного в верхней части других методов класса (как упоминалось ранее, как это делают PHP и Java), тогда вы могли бы создать небольшой метод this._constructor()
и поместить туда вещи, и назовите это в конце вашего класса:
function newObj(){
this.v1 = 10;
this.v2 = 20;
this._constructor = function(){ // do constructor things here
this.func1();
this.func2();
}
this.func1 = function(){ ....};
this.func2 = function(){ ....};
this.func3 = function(){ ....};
this._constructor(); // call just one method here, nice and tidy
}
Некоторые могут сказать, что это несколько избыточно, но все, что помогает ускорить ваш рабочий процесс ...:)
Просто для записи: если вы хотите передать какой-то аргумент при создании / создании объекта, скажем, что вы хотите иметь опцию для установки this.v1
, тогда вы можете сделать это следующим образом:
function newObj(set_v1){
this.v1 = 10;
this.v2 = 20;
this._constructor = function(set_v1){ // do constructor things here
if ( set_v1 != undefined ){ // you can come up with a better condition here
this.v1 = set_v1;
}
this.func1();
this.func2();
}
this.func1 = function(){ ....};
this.func2 = function(){ ....};
this.func3 = function(){ ....};
this._constructor(set_v1); // call the constructor here and pass the argument
}