JavaScript- 객체 이니셜 라이저?
-
05-07-2019 - |
문제
나는 당신이 다음과 같이 자동으로 객체에 속성을 실행할 수 있다는 것을 깨달았습니다.
var obj = {
init:(function(){ alert('loaded');})();
}
이 메소드를 객체의 이니셜 라이저로 사용하려고합니다. 내가 겪고있는 문제는 'obj'에 대한 언급을 Init 속성에 전달하는 것입니다. OBJ가 아직 브라우저에 완전히 내장되지 않았기 때문에 오류가 발생한다고 생각합니다. 나는 다음을하려고하지만 실패했습니다. 이를 수행 할 방법이 있다면 방법을 알고 싶습니다.
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에서 OK를 테스트했습니다. 50 밀리 초에 대해서는 잘 모르겠지만 충분하다고 생각합니다.
var obj = {
prop: function() { alert('This just ran.') },
init: ( function(){ setTimeout(function(){obj.prop()},50) } )()
}
이것은 user1575313에서 제출 한 예제에 대한 업데이트입니다.
원래 코드는 작동하지만 설정 후 객체 사용을 제한합니다. 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(); }
}
물체 리터럴은 세미콜론이없는 쉼표로 구분 된 멤버를 재평가합니다.
"this"를 InINT 함수로 전달하면 작동합니까?
다음과 같은 것 : (테스트되지 않은)
var obj = {
prop:function(){ alert('This just ran.'); },
init:(function(o){ o.prop(); })(this);
}