Подтвердить что ты не робот

Javascript - инициализатор объекта?

Я понял, что свойство объекта можно запустить автоматически следующим образом:

var obj = {

    init:(function(){ alert('loaded');})();

}

Я пытаюсь использовать этот метод как инициализатор для объекта. Проблема, с которой я сталкиваюсь, - передать ссылку на объект obj на свойство init. Я подозреваю, что он генерирует ошибки, потому что obj еще не был полностью создан в браузере. Я пытаюсь сделать следующее, но безуспешно. Если есть способ сделать это, я хотел бы знать, как это сделать.

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(){ obj.prop(); })();
}
4b9b3361

Ответ 1

Если вы хотите создать несколько экземпляров похожих объектов, вам следует использовать простые старые конструкторские функции (не забудьте поместить общие свойства в прототип!).

Если вы хотите создать один объект, подумайте об использовании анонимного конструктора. Ваш пример будет читать:

var obj = new (function() {
    this.prop = function() {
        alert('This just ran.');
    }

    // init code goes here:
    this.prop();
});

Это дополнительное преимущество над объектными литералами: функция-конструктор может использоваться как замыкание над переменными 'private'.

Не злоупотребляйте литералами объектов: они могут сделать простые вещи простыми, но сложные вещи будут усложняться.

Ответ 2

Это невозможно: obj не существует, пока не будет интерпретирован весь блок.

Ответ 3

Простая альтернатива:

var obj = {

  init: function(){ 
    alert('loaded');
  }

}.init();

Ответ 4

Почему бы вам не использовать модель contructor (на самом деле, я не знаю ее правильного имени):

function Obj() {
    // Initialising code goes here:
    alert( 'Loaded!' );

    // ...

    // Private properties/methods:
    var message = 'hello',
        sayHello = function() {
            alert(message);
        };

    // Public properties/methods:
    this.prop = function() {
        sayHello();
    };

    // Encapsulation:
    this.setMessage = function(newMessage) {
        message = newMessage;
    };
}

Использование:

var instance = new Obj();
instance.setMessage('Boo');
instance.prop();

Ответ 5

Да, obj, похоже, не существует локально дольше. Это сработало для меня с setTimeout. Проверено на IE8, FF5, Chrome 12, Opera v11.5. Не уверен, что за 50 миллисекунд, я думаю, этого достаточно.

var obj = {
    prop: function() { alert('This just ran.') },
    init: ( function(){ setTimeout(function(){obj.prop()},50) } )()
}

Ответ 6

Инициализировать в стиле jQuery

(function() {

var $ = function(){
  return new $.fn.init();
};

$.fn = $.prototype = {
  init: function(){ 
    this.prop(); 
  },
  i: 0,
  prop: function(){ 
    alert('This just ran. Count: ' + (++this.i)); 
    return this;
  }
};

$.fn.init.prototype = $.fn;

$().prop().prop();

})();

jsbin.com

Ответ 7

это обновление для примера, представленного пользователем1575313.

исходный код работает, но он ограничивает использование объекта после установки. Возвращая ссылку на объект в методе init, он позволяет использовать объект вне объекта.

ссылка на jsFiddle. jsFiddle

var obj = {

init: function()
{ 
    alert('loaded'); 

    this.consoleLog(); 

    /* we want to return this to keep object 
    usable after auto init */ 
    return this;
}, 

consoleLog: function() 
{
    console.log(1); 
}

}.init(); 

/* the obj should now be usable outside the auto init */ 
obj.consoleLog();

Ответ 8

Я думаю, вы хотите попробовать что-то вроде этого:

var obj = {
    prop: function() { alert('This just ran.'); },
    init: function() { obj.prop(); }
}

Объектные литералы запрашивают разделенные запятыми элементы без точек с запятой.

Ответ 9

Работает ли он, если вы передадите "this" в функцию init?

что-то вроде: (untested)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}