Вопрос

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

var obj = {

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

}

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

var obj = {
    prop:function(){ alert('This just ran.'); },
    init:(function(){ obj.prop(); })();
}
Это было полезно?

Решение

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

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

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

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

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

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

Другие советы

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

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

var obj = {

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

}.init();

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

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

Да, кажется, что 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) } )()
}

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

Инициализация в стиле 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

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

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

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

Будет ли это работать, если вы передадите «это»? в функцию инициализации?

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

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