문제

나는 당신이 다음과 같이 자동으로 객체에 속성을 실행할 수 있다는 것을 깨달았습니다.

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

})();

jsbin.com

나는 당신이 다음과 같은 것을 시도하고 싶다고 생각합니다.

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);
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top