Как вызвать функцию во время построения объекта в Javascript?

Я хочу создать объект и запустить два его метода при создании объекта. Так что если мой объект

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, но он, похоже, не работает.

Ответ 1

Добавить инструкции вызова метода в конструкторе:

function newObj(){
this.v1 = 10;
this.v2 = 20;
this.func1 = function(){ ....};
this.func2 = function(){...};
this.func1();
this.func2();
}

Я думаю, что это решение ваших потребностей.

Ответ 2

Просто вызовите его из самого конструктора, он отлично работает: 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();
}

Ответ 3

Это работает для меня в 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();

Ответ 4

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

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

DEMO

Ответ 5

Используя функцию самозапуска, которую мы можем вызывать, мы также можем совместно использовать родительский параметр, выполняя некоторую работу с открытой переменной 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

Ответ 6

Я думаю, что, возможно, необходимо, чтобы в 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
}