Как вызвать функцию во время конструирования объекта в Javascript? - PullRequest
11 голосов
/ 25 января 2011

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

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

и вызов объекта

var temp = new newObj();

Я хочу запустить func1() и func2(), не вызывая их explicity для временной переменной, например temp.func1(). Я хочу, чтобы они вызывались при создании новой переменной Object. Я пытался поместить this.func1() в объявление newObj, но, похоже, оно не работает.

Ответы [ 6 ]

10 голосов
/ 25 января 2011

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

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

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

6 голосов
/ 25 января 2011

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

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

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

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

0 голосов
/ 07 апреля 2017

Я думаю, что, возможно, нужно подчеркнуть, что в 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
}
0 голосов
/ 21 июня 2014

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