Javascript – инициализатор объекта?
-
05-07-2019 - |
Вопрос
Я понял, что вы можете автоматически запускать свойство объекта следующим образом:
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();
})();
Я думаю, вы хотите попробовать что-то вроде этого:
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);
}