Javascript - инициализатор объекта?
Я понял, что свойство объекта можно запустить автоматически следующим образом:
var obj = {
init:(function(){ alert('loaded');})();
}
Я пытаюсь использовать этот метод как инициализатор для объекта. Проблема, с которой я сталкиваюсь, - передать ссылку на объект obj на свойство init. Я подозреваю, что он генерирует ошибки, потому что obj еще не был полностью создан в браузере. Я пытаюсь сделать следующее, но безуспешно. Если есть способ сделать это, я хотел бы знать, как это сделать.
var obj = {
prop:function(){ alert('This just ran.'); },
init:(function(){ obj.prop(); })();
}
Ответы
Ответ 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);
}