2012-03-18 4 views
2

내 litteral 객체의 속성 값을 얻기 위해 어떻게 이렇게 할 수. 그렇다면 그 가치를 갖는 방법?은 자동 실행 방법

업데이트 :하는 모형 객체에서 현실 세계에서 올 수

var person = { 
    name: "", 
    __test__: (function() {name = "john"})() 
}` 

'존', 제 요점은 내가 무엇이든 데이터베이스 : 더 이해하기 위해, 차라리이 즉 자동 inialisation을 수행 할 자체 포함 된 방식으로이 작업을 수행하려면 테스트을 외부 개체에서 호출하지 마십시오.

+0

나를 위해 정의되었습니다. 어떤 설정을 사용하고 있습니까? – Blender

+0

코드의 의미는 무엇입니까 ??? – gdoron

+0

@gdoron 내 업데이트를 참조하십시오. – user310291

답변

4

. this은 을 말합니다. 이후 리터럴이 계산되는 동안 평가 중에 this은 부모 범위를 나타냅니다. 함수에 객체 구성을 래핑하여 this이 현재 범위 (즉, 함수의 범위)를 참조하는지 확인할 수 있습니다. 뭔가 같이 : 함수의 범위 내에서

var person = function(){ 
    this.name = 'John'; 
    this.__test__ = (function(){alert(this.name);}()); 
    return this; 
}(); 

또는 사용 변수 :

var person = function(){ 
    var _name = 'John' 
     ,_test = (function(){alert(_name);}()); 
    return { name: _name, __test__: _test }; 
}(); 

또는 더 일반적인 공장 기능에 물건을 포장 : 마지막으로

function objFactory(obj){ 
    var nwObj = {}; 
    for (var l in obj){ 
     if (obj.hasOwnProperty(l)){ 
      if (obj[l] instanceof Function && /^auto_/i.test(l)){ 
      nwObj[l.replace(/^auto_/i,'')] = obj[l].call(nwObj); 
      } 
      else { 
      nwObj[l] = obj[l]; 
      } 
     } 
    } 
    return nwObj; 
} 
//=> usage 
var person = objFactory(
       { name: '', 
       auto_name: function(){ 
          this.name='John'; 
          return this.name; 
          } 
       } 
      ); 
alert(person.name); //=> John 

그리고 (모든 사람이 동의 할 것이다 이)에서로드 핸들러를 만들 수 있습니다 Object.prototype :

Object.prototype.load = function(){ 
    for (var l in this){ 
     if (this.hasOwnProperty(l) 
      && this[l] instanceof Function 
      && /^auto_/i.test(l)) { 
      this[l].call(this); 
      delete this[l]; 
     } 
    } 
    return this; 
} 
//=> usage 
var person = { 
       name: '', 
       auto_name: function(){this.name='John';} 
      }.load(); 
alert(person.name); //=> John 
,
+0

감사합니다. 그것에 대해 생각해 보겠습니다. 그럼에도 불구하고 리터럴 객체는 생성자가 가득 찬 클래스보다 가벼운 구문이며 덜 복잡합니다. 그런 식으로 할 수 있기를 바랍니다. 그리고 litteral 객체가 함수로 생성 된 객체와 다르게 동작하는 이유를 이해할 수 없습니다. – user310291

+0

@ user310291 당신은 [this] (http://jsfiddle.net/U8kMP/1/) 바이올렛 – gdoron

+0

@ user310291을 사용할 수 있습니다 :이 경우에는 완전히 날아간 생성자가 아닙니다 (자바 스크립트는 클래스를 알지 못합니다).하지만 즉시 호출됩니다. (익명) 기능. 범위 지정을보다 명확하게 보여주는 예제를 추가했습니다. – KooiInc

1

자동 실행 기능와 코드의 범위는 window (나는 그것이 기능과하지 person라고 누가 becuase는 추측)입니다.

그래서 나는 이것이 (이렇게) 할 수 없다고 생각합니다.

는이 DEMO

왜 대신를 사용하지 않습니다 참조 : 당신은 객체 리터럴을 사용하여이 작업을 수행 할 수

var person = { 
    name: "John", 
    __test__: function() {alert(this.name)} 
} 
person.__test__(); 
+0

외부 개체에서 테스트를 호출하지 않는 자체 포함 방식으로이 작업을 수행하려고합니다. – user310291

+0

@ user310291 Kooilnc의 대답으로이 필요성이 충분하지 않은 이유는 무엇입니까? – gdoron

+0

예 Kooilnc은 그것을 할 수 있습니다. 단지 리터럴 객체를 사용할 수 있기를 바랍니다. 이 때문에 문법을 변경해야한다는 말은 어리 석다. – user310291

1

는이 작업을 수행합니다 :

var person = { 
    name: "John", 
    __test__: function() { alert(this.name) } 
}; 
person.test(); 

person.test() 실행할 수 있습니다 person.test 에 익명 함수를 할당합니다. 원래 코드에서, 당신이 아무것도 반환하지 않았기 때문에 person.test이 (정의되지 익명 함수의 결과를 할당 의미 자체 실행 기능을했다. 그것이 정의되지 않은 경고를하는 이유에 대해서는

을 어떻게 구글 폐쇄 및 익명 함수가 작동 자바 스크립트. 기본적으로, 는 익명 함수를 실행 자체에 컨텍스트를 잃는다.

+0

그 사람에게 문제가되지 않습니다 .____ test__에는 반환 값이 중요하지 않으므로 값이 할당됩니다. 외부 객체에서 테스트를 호출하지 않는 자체 포함 방식으로이 작업을 수행하려고하므로 객체 외부에서 호출하고 싶지 않습니다. – user310291

1

당신은 아마도 당신이 개체에 액세스하려고로 구축되기 전에 그렇게 할 수 있습니다.두 번째로, 익명의 함수를 생성하고 withThat을 사용하여 값을 객체에 대한 컨텍스트없이 평가 한 다음 적절한 키와 함께 저장합니다.

var func = function() {return this;}; 
// when invoked as such 
func(); 
// will return global namespace (or window in a browser). 

var obj = {"func": func}; 

obj.func(); 
// now calling func on obj so this is now obj and returns obj 

어쩌면 당신은 당신이 생성자를 원하는 acheive 수 :

function MyObject() { 

    this.name = "John"; 
    this.__test_func__ = function() {alert(this.name);}; 
    this.__test__ = this.__test_func__(); 

    // or you could try passing in your object explicitly 
    this.__test__ = (function(pseudo_this){alert(pseudo_this.name);})(this); 
} 

var obj = new MyObject(); 

또 한가지는, 경고가 리턴 값이없는 (이 정의되지 않은 반환). 나는 당신이 그것을 알고 있다고 가정하고, 건설 중반에 물체의 상태를 조사하려고 시도하고 있었다고 가정합니다. 객체의 내용을 지정하는 것보다 복잡한 작업을 수행하려면 리터럴이 아닌 생성자를 사용해야합니다.

+0

모든 설명에 대해 확인해 주셔서 감사합니다. 불행히도 하나의 좋은 대답 만 표시 할 수 있습니다. 모든 사람들이 내가 리터럴 개체로 만들 수는 없지만 생성자를 사용한다고 말합니다. – user310291