Ответ 1
Добавить инструкции вызова метода в конструкторе:
function newObj(){ this.v1 = 10; this.v2 = 20; this.func1 = function(){ ....}; this.func2 = function(){...}; this.func1(); this.func2(); }
Я думаю, что это решение ваших потребностей.
Я хочу создать объект и запустить два его метода при создании объекта. Так что если мой объект
function newObj(){
this.v1 = 10;
this.v2 = 20;
this.func1 = function(){ ....};
this.func2 = function(){...};
}
и вызов объекта
var temp = new newObj();
Я хочу запустить func1()
и func2()
, не вызывая их эксплицитности по переменной temp, например temp.func1()
. Я хочу, чтобы они вызывались при создании новой переменной Object. Я попытался разместить this.func1()
внутри объявления newObj
, но он, похоже, не работает.
Добавить инструкции вызова метода в конструкторе:
function newObj(){ this.v1 = 10; this.v2 = 20; this.func1 = function(){ ....}; this.func2 = function(){...}; this.func1(); this.func2(); }
Я думаю, что это решение ваших потребностей.
Просто вызовите его из самого конструктора, он отлично работает: http://jsfiddle.net/yahavbr/tTf9d/
Код:
function newObj(){
this.v1 = 10;
this.v2 = 20;
this.func1 = function() { alert("func1"); };
this.func2 = function() { alert("func2"); };
this.func1();
this.func2();
}
Это работает для меня в Chrome:
function newObj(){
this.v1 = 10;
this.v2 = 20;
this.func1 = function(){ this.v1 += 1; };
this.func2 = function(){ alert(this.v1); };
this.func1();
this.func2();
}
var obj = new newObj();
Попробуйте обернуть его в функцию самостоятельного вызова, если вы никогда не планируете повторно использовать его, например:
function newObj(){
this.v1 = 10;
this.v2 = 20;
this.func1val = (function(){ alert('called from c\'tor'); })();
this.func2val = (function(){ return 2 + 1; })();
}
var temp = new newObj();
alert('temp.func2val = ' + temp.func2val);
Используя функцию самозапуска, которую мы можем вызывать, мы также можем совместно использовать родительский параметр, выполняя некоторую работу с открытой переменной var that = this;
function newObj(){
this.v1 = 10; // public variable
this.v2 = 20; // public variable
var that = this; // Allow access to parent function variable to inner function
(function(){
// access parent function variable
// using 'that' ex:
that.v1 = 50;
//fun1code stuff
})();
(function(){
// access parent function variable
// using 'that' ex:
that.v2 = 60;
//fun2code stuff
})();
}
var temp = new newObj();
console.log(temp.v1); // output 50
console.log(temp.v2); // output 60
Я думаю, что, возможно, необходимо, чтобы в 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
}