2013-11-22 2 views
0

프로토 타입 메서드 .nextSlide를 사용하여 생성자 함수에서 변수 HTML에 액세스 할 수없는 이유는 무엇입니까?프로토 타입 메서드를 사용하여 생성자 함수의 변수에 액세스

function test(root){ 

    var HTML = getAllHTML(); 

    function getAllHTML(){ 

     var boss, expoHTML; 
     var boss = document.querySelector(root); 

     expoHTML = { 

      slides: boss.querySelectorAll(".slide"), 
      prev: boss.querySelector(".control.prev"), 
      next: boss.querySelector(".control.next"), 
      current: boss.querySelector(".slide-current"), 
      total: boss.querySelector(".slide-total") 

     } 

     return expoHTML; 

    } 


} 


EXPOjs.prototype.nextSlide = function(){ 

    alert(HTML.current) 

} 


var newTEST = new test(".ieps"); 
newTEST.nextSlide(); 
+0

어쩌면이 대답은 프로토 타입, 생성자 함수 및 'this' 변수가 무엇인지 이해하는 데 도움이 될 수 있습니다. http://stackoverflow.com/a/16063711/1641941 여기에는 개인 변수에 대한 패턴이 있지만 더 나은 것은 소개로 시작하십시오. 어쩌면 거기에 햄스터 코드가 있습니다. 질문이 있으시면 연락해 주시면 답변 드리겠습니다. – HMR

답변

1

"범위"문제입니다. Javascript의 모든 변수에는 "이 변수를 볼 수있는 사람"이라는 의미의 범위가 있습니다.

HTMLtest()에 정의되어 있습니다. 이것은 볼 수 있음을 의미합니다 : 함수 을 정의 된 함수 내에서 test()

    • 그것 뿐이다 test()

    내. test() 외부에서는 HTML이 비어 있습니다.

    이제 test()를 생성자 함수로 사용하고있는 것을 볼 수 있습니다. 이것으로, 당신은 객체 생성과 자바 스크립트의 훌륭한 세계에 들어서게됩니다. 심호흡 : D

    이 수행 할 때 다음

    function Person(age){ 
        this.age = age; 
    } 
    

    그리고 당신은 수행

    var pavlo = new Person(23); 
    

    는 기본적으로 "새로운"의 효과가 있습니다 만들기

    • 을 빈 개체
    • 함수를 실행하여새로 생성 된 객체
    • -점은이 속임수는 당신이

      var pavlo = new Person(23); 
      console.log(pavlo.age); 
      

      을 수행 할 수 있습니다 그리고 프로토 타입 기능이 있다는 것을 의미 pavlo

    에 새로 생성 된 객체를 할당합니다. 이 같은 함수를 정의하는 경우 : 해당 생성자를 사용하여 만든 개체에 액세스 할 수 Person'sprototype 객체에 정의

    Person.prototype.setAge = function(newAge){ 
        this.age = newAge(); 
    } 
    

    모든 기능 (또는 그 문제에 대한 모든 변수를). 또한 this 변수가 해당 호출을 수행하는 객체가됩니다.

    그래서, 당신이있는 경우 :

    function Person(age){ 
        this.age = age; 
    } 
    
    Person.prototype.setAge = function(newAge){ 
    
        `this` at this point is the object "calling" 
        this.age = newAge(); 
    } 
    
    var pavlo = new Person(23); 
    console.log(pavlo.age); 
    
    // pavlo is making the call. So, within `setAge()`, `this` will be `pavlo` 
    pavlo.setAge(26); 
    

    그래서, 당신의 솔루션 : 다음

    function test(root){ 
        this.HTML = getAllHTML(); 
        // etc. 
    } 
    

    그리고 당신의 경고가 있어야한다 :

    test.prototype.nextSlide = function(){ 
        alert(this.HTML.current); 
    } 
    

    참고 자바 스크립트에서 당신은해야 대문자로 시작하는 생성자 함수가 있습니다 (대신 Test 참조).).

    외부에서 HTML에 액세스 할 수 없도록하려는 경우 일반적으로 변수 이름 앞에 밑줄을 붙입니다 (_HTML).

    거기에 은 개발자가 숨길 변수를 절대적으로 숨겨야하는 경우 다른 방법으로입니다. 그러나 정확하지는 않으며 대부분의 개발자는 말할 필요가 없습니다.

    좋은 몇 가지 (나는 내가 JS로 시작하는 때를 읽고, 그들이 당시 나를 지옥 혼동라고해야하지만, : D) 읽는 당신이 알고 (

    UPDATE 이해가 경우에만 읽기 :이 다른 환상적인입니다 이 문제에 관한 기사는https://blog.jcoglan.com/2012/01/19/the-cost-of-privacy

    즐기십시오!

  • +0

    코드 샘플에서 처음 본 것이 처음이라고 생각합니다. Upvoted. :) – Pavlo

    +0

    : D 두 개의 추가 기사가 추가되었습니다! 행복 범위 : D – Merc

    +0

    나는 내 마음에 와서 첫 번째 이름을 사용하여 코드를 작성 ... 그리고 음, 우연의 일치 아 : D 조 – Merc

    관련 문제