Javascript - инициализатор объекта? - PullRequest
20 голосов
/ 08 марта 2009

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

var obj = {

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

}

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

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

Ответы [ 9 ]

22 голосов
/ 08 марта 2009

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

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

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

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

Это имеет дополнительное преимущество перед объектными литералами: функцию конструктора можно использовать как замыкание над «приватными» переменными.

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

5 голосов
/ 08 марта 2009

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

4 голосов
/ 13 февраля 2014

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

var obj = {

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

}.init();
3 голосов
/ 08 марта 2009

Почему бы вам не использовать модель конструктора?

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();
2 голосов
/ 04 июля 2011

Да, кажется, что 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) } )()
}
1 голос
/ 31 декабря 2014

это обновление к примеру, представленному пользователем 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();
1 голос
/ 28 сентября 2013

Init в стиле 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

0 голосов
/ 08 марта 2009

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

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

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

0 голосов
/ 08 марта 2009

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

что-то вроде: (не проверено)

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(o){ o.prop(); })(this);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...