5

getter/setter 메서드를 동적으로 만들어 개인 속성을 검색하고 싶습니다.Javascript 동적으로 getter/setter 개인 속성

이것은 내가 한 행동입니다. 다음과 같이

function winClass (posX, posY, w, h) { 
    var x = posX || 0; 
    var y = posY || 0; 
    var width = w || 0; 
    var height = h || 0; 
} 

가 그럼 난 게터/세터 방법과 winClass 확장 : 모든

첫째, 나는 클래스를 만들어

winClass.prototype.getX = function() { 
    return x; 
} 

winClass.prototype.setX = function (val) { 
    x = val; 
} 

을 그리고 나서 테스트 :

var win1 = new winClass (10, 10, 100, 100); 
document.write (win1.getX()); 

그러나 'getX'메소드를 설치하려고하면 다음 오류가 발생합니다. 'x is not defined'. 'x'가 winClass 범위에 없기 때문에 개인 변수에 대해 getter/setter 메서드를 동적으로 설정하는 방법을 알지 못하기 때문에 의미가 있습니다.

아이디어가 있으십니까?

답변

13

getter/setter는 개인 변수를 볼 수있는 범위에 있어야하며 이러한 변수를 볼 수있는 유일한 범위는 생성자의 내부입니다. 이것이이 변수들이 실제로 사적인 이유입니다. 따라서 setter/getter를 만들려면 함수를 볼 수있는 범위에 함수를 넣어야합니다. 이것은 작동합니다 : http://jsfiddle.net/jfriend00/hYps2/을 :

function winClass (posX, posY, w, h) { 
    var x = posX || 0; 
    var y = posY || 0; 
    var width = w || 0; 
    var height = h || 0; 

    this.getX = function() {return(x);} 
    this.setX = function(newX) {x = newX;} 
} 

var win1 = new winClass (10, 10, 100, 100); 
alert(win1.getX()); // alerts 10 

당신이 여기서 일 볼 수 있습니다. 당신이 (나에게 아무 의미 이러한 변수의 개인 성격 주위를 해킹하려는 경우,

function winClass (posX, posY, w, h) { 
    var privates = {}; 
    privates.x = posX || 0; 
    privates.y = posY || 0; 
    privates.width = w || 0; 
    privates.height = h || 0; 

    this.get = function(item) {return(privates[item]);} 
    this.set = function(item, val) {privates[item] = val;} 
} 

var win2 = new winClass(10,10,100,100); 
alert(win2.get("x")); // alerts 10 

을 그리고 : 당신이 음부에 대한 일반 게터/세터를 원하는 경우에

, 당신은 이런 식으로 그것을 할 수 당신은뿐만 아니라) 그들에게 다음 표준 인스턴스 변수를 만들 수 있습니다, 당신은 이런 식으로 작업을 수행 할 수 있습니다 여기

function winClass (posX, posY, w, h) { 
    var privates = {}; 
    privates.x = posX || 0; 
    privates.y = posY || 0; 
    privates.width = w || 0; 
    privates.height = h || 0; 

    this.getPrivates = function() {return(privates);} 
} 

winClass.prototype.getX = function() { 
    return(this.getPrivates().x); 
} 

winClass.prototype.setX = function(newX) { 
    this.getPrivates().x = newX; 
} 

예 : http://jsfiddle.net/jfriend00/EKHFh/합니다.

물론 이것은 변수의 개인 특성을 파괴하므로 정규 인스턴스 변수를보다 쉽게 ​​만들 수 있고 동일한 액세스 제어를 할 수 있기 때문에 실제로 이런 식으로하는 것이 아무런 의미가 없습니다.

그리고 완벽을 기하기 위해 프로토 타입에 접근 자 메서드를 자유롭게 추가 할 수있는 일반 인스턴스 변수 메서드가 있지만 변수는 private이 아닙니다.

function winClass (posX, posY, w, h) { 
    this.x = posX || 0; 
    this.y = posY || 0; 
    this.width = w || 0; 
    this.height = h || 0; 
} 

winClass.prototype.getX = function() { 
    return(this.x); 
} 

winClass.prototype.setX = function(newX) { 
    this.x = newX; 
} 
+0

따라서 자바에서는 '프로토 타입'의 개념이 객체 지향 인 척하려고하는 퍼지 (fudge)입니다. –

+0

그러나 이것은 동적이 아닌 getters/setters의 정적 선언입니다.winClass에 동적으로 추가해야합니다. – Wilk

+0

@Wilk - "동적 getter/setter"를 정의하고 수행하려는 것을 설명하십시오. – jfriend00

1

이 문서는 this에서 JavaScript로 C# 스타일 getter 및 setter를 작성하는 방법을 설명합니다. 매우 차가운