2009-03-08 7 views
18

난 당신이 다음과 같이 자동으로 물체 실행의 속성을 가질 수 있습니다 깨달았다 : 나는 개체에 대한 초기화로이 방법을 사용하기 위해 노력하고있어자바 스크립트 - 개체 이니셜 라이저?

var obj = { 

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

} 

. 내가 겪고있는 문제는 'obj'에 대한 참조를 init 속성에 전달하는 것입니다. obj가 아직 브라우저에 완벽하게 구축되지 않았기 때문에 오류가 발생합니다. 다음과 같은 일을하려하지만 실패했습니다. 이렇게 할 수있는 방법이 있다면, 어떻게하는지 알고 싶습니다.

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

답변

21

비슷한 객체라면 일반 오래된 생성자 함수를 사용해야합니다 (공유 속성을 프로토 타입에 넣어야합니다!).

단일 개체를 만들려면 익명 생성자를 사용하는 것이 좋습니다. 귀하의 예를 읽을 것입니다 :

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

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

이 객체 리터럴을 통해 추가적인 이점이있다 : 생성자 함수는 '개인'변수를 통해 폐쇄로 사용할 수 있습니다.

개체 리터럴을 과도하게 사용하지 마십시오. 간단한 개체를 단순하게 만들 수 있지만 복잡한 작업은 지나치게 복잡해집니다.

+0

흥미 롭습니다. 익명의 생성자에 대한 문서를 어디에서 찾을 수 있는지 알고 있습니까? –

+1

@JW, 익명 생성자는 익명 함수가 생성자 (즉,'new' 키워드로 호출 됨)로 사용된다고 생각합니다. http://stackoverflow.com/questions/20057431/javascript-anonymous-constructor-function-function 및 http://enfinery.com/30/javascript-the-case-of-an-anonymous-constructor – iX3

-1

"this"를 초기화 함수에 전달하면 작동합니까? 같은

뭔가 : 세미콜론없이

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

개체 리터럴 reqire 쉼표로 구분 된 회원 : (안된)

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

Nah. (이)는 window.object에 대한 참조입니다. – Geuis

+1

직접 관련이 없지만 http://jsfiddle.net/ – Audrius

0

난 당신이 뭔가를 시도하려는 생각합니다.

+0

을 사용하여 프로토 타입을 작성하고 테스트 할 수 있습니다. 생성시 init 함수를 실행하지 않아도됩니다. –

+0

맞습니다 - isn 객체 리터럴을 사용하여이를 수행 할 수 없습니다. –

5

이것은 불가능합니다. obj는 전체 블록이 해석 될 때까지 존재하지 않습니다.

3
당신이 생성자 모델을 사용 (사실, 나는 그것의 올바른 이름의 아무 생각)하지 않는 이유

:

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

생성자에서 초기화하지 않는 이유는 프로토 타입 (예 : 하위 클래스 만들기)을 원할 때마다 생성자를 호출해야한다는 것입니다. function XObj() {...}; XObj.prototype = new Obj() ;. 이 경우 실제 인스턴스를 초기화하고 싶지는 않습니다. – bobince

2

예, 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) })() 
} 
+0

이 항목을 참조하십시오. 'var' 문 다음의 다음 줄이'obj.prop'을 사용해야 할 경우 작동하지 않습니다. – nnnnnn

1

에서 초기화 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

4

간단한 대안 :

var obj = { 

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

}.init(); 
+2

이것은'init()'이 반환하는 값에'obj'를 설정한다는 것을주의하십시오.이 예제에서는'undefined'입니다. – nnnnnn

1

이이 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(); 
관련 문제