2014-11-27 2 views
1

Object.defineProperty 메서드를 사용하여 일부 getter 및 setter를 정의하는 javascript 객체를 가지고 놀고 있습니다.Object.defineProperty 및 반환 값

function User() {  
    var _username; 
    var _id; 

    Object.defineProperty(User, 'id', { 
     get: function() { 
      return _username; 
     }  
    });   

    Object.defineProperty(User, 'username', { 
     get: function() { 
      return _username; 
     }, 
     set: function(username) { 
      this._username = username;   
     } 
    }); 
} 

속성 (id) 중 하나에 대해서만 나는 getter 만 필요합니다. 원래 나는 오타가 있었는데 _username의 값을 되 돌리는 중이었지만, 나는 위의 것이 작동하지 않는다는 것을 빨리 깨달았습니다. 그러나 호기심을 위해서, 나는 그것이 예상대로 작동하지 않는 이유를 이해하려고 노력하고 있습니다. 나는 다음과 같은 한 경우 :

var u = new User(); 
u.username = 'bob'; 
alert(u.username); 
alert(u.id); 

마지막 문은 undefined 대신 bob 경고 것입니다. 왜 그런가요? 그리고 다른 재산을 되 찾을 수있는 방법이 있습니까?

+0

this에 속성을 정의해야합니다. 'User.username'을 사용해보십시오. 그리고 생성자 함수를 변경하지 않도록 코드를 수정하십시오. – Bergi

답변

1

당신은하지 u``에, 대신 당신은 User``에 속성을 정의하고 생성자 함수

function User(params) {  
    var _username; 

    Object.defineProperty(this, 'id', { 
     get: function() { 
      return _username; 
     }  
    });   

    Object.defineProperty(this, 'username', { 
     get: function() { 
      return _username; 
     }, 
     set: function(username) { 
      _username = username;   
     } 
    }); 
    if (params && params.username) { 
     this.username = params.username; 
    } 
} 
User.prototype.stringify = function() { 
    return JSON.stringify({ username: this.username}); 
} 
+0

'this'로 변경하면 효과가없는 것 같습니다. 그렇게하고 원래 게시물에 사용자 테스트 코드를 실행하면 첫 번째 경고와 두 번째 경고가 모두 '정의되지 않음'으로 출력됩니다. – user1491636

+0

예를 들어 [jsfiddle] (http://jsfiddle.net/)에서 수행 한 작업을 표시 할 수 있습니까? –

+0

여기 있습니다 ... 고마워요. http://jsfiddle.net/930ht61v/ – user1491636