2016-10-19 4 views
0

여기 정확히 같은 질문을 묻습니다. define property in constructor하지만 대답이 만족 스럽지는 않다고 생각합니다. 이 코드는 "Object Oriented JavaScript의 원리"라는 책에서 약간의 수정을 통해 질문을보다 명확하게 복사 한 것입니다.생성자, getter 및 setter 메서드의 Object.defineProperty

function Person(xname) { 
    Object.defineProperty(this, "name", { 
     get: function() { 
      return xname; 
     }, 
     set: function(newName) { 
      name = newName; 
     }, 
     configurable: true, 
     enumerable: true 
    }); 
    this.sayName = function() { 
     console.log(this.name); 
    }; 
} 

var One = new Person("Mark"); 

One.sayName(); 
console.log(One.name); 
//output: 
//Mark 
//Mark 

이 더 있었다 지역 변수의 사용을 혼란과 같은 이름을 가진 개체 속성 때문에이 매개 변수 이름 XName이을 수정했습니다.

나는이 코드가 의도 한대로 작동하고 있는지 의심 스럽지만 뭔가하는 것처럼 나를 혼란스럽게합니다.

  1. 는 나는 "이름"이라는 새로 생성 된 인스턴스의 속성을 만들 생성자 내부 Object.defineProperty 사용하고 있음을 이해합니다.

  2. 게터 방법은 XName이를 반환하고 아직 XName이은 줄 끝에서 범위를 간다 : VAR 하나 = 새로운 사람 ("마크"); 나중에 코드 객체에서 어떻게 할 수 있습니까? 하나의 getter가 xname의 값을 반환하는 것을 관리합니까? 그것은 작동해야처럼 이름을 반환 내가 게터 방법을 변경하는 경우 때문에

  3. 그리고 엔진은가 정의되지 않은 오류 이름을보고,XName이의 값입니다. (get : function() {return name;})

  4. setter 메서드가 전혀 작동하지 않는다는 것은 말할 필요도 없습니다. One.name = "Mickey"를 코딩하면 One.name은 여전히 ​​"Mark"로 설정됩니다.

xname이 .name에 할당되어 있지 않거나 표시되지만 보이지 않습니다.

+2

* "xname에 매개 변수 이름을 수정했습니다. 왜냐하면 같은 이름의 로컬 변수 및 개체 속성을 사용하는 것이 훨씬 더 혼란 스럽기 때문입니다." . 너는 세터를 놓쳤다. –

+0

\ * has>> * (죄송합니다) * –

답변