2011-09-23 12 views
2

어떻게 보호 된 변수를 선언합니까? 나 여기 예를 들어 그 또한 자동차 클래스에 존재 ic.variabl 나는이 액세스 할 수있는 변수를하고 싶은이의자바 스크립트에서 보호 된 변수 선언

// Constructor 
function Car(){ 

    // Private Variable 
    var model; 
} 

// Public variable 
Car.prototype.price = "5 Lakhs"; 

// Subtype 
function Indiancar(){ 
} 

// Prototype chaining 
Indiancar.prototype = new Car(); 


// Instantiating Superclass object 
var c = new Car(); 

// Instantiating subclass object 
var ic = new Indiancar(); 

을 드리겠습니다.

var Base = function() 
{ 
    var somePrivateVariable = 'Hello World'; 

    this.GetVariable = function() 
     { 
      return somePrivateVariable; 
     }; 

    this.SetVariable = function(newText) 
     { 
      somePrivateVariable = newText; 
     }; 
}; 

var Derived = function() 
{ 
}; 

Derived.prototype = new Base(); 

var instance = new Derived(); 

alert(instance.GetVariable()); 
instance.SetVariable('SomethingElse'); 
alert(instance.GetVariable()); 

내가 제대로 질문을 이해 가정 :

+3

자바 스크립트에는 공개, 비공개 또는 보호 된 변수와 같은 것이 없습니다. Java 또는 C#과 같은 JavaScript 작성을 중지하십시오. –

+3

그건 완전히 사실이 아닙니다. 클로저를 통해 '보호 된'변수에 대한 접근 자 및 설정자를 직접 노출하지 않고 만들 수 있습니다. – Tejs

+0

@Tejs : 예, 그렇다고해서 JavaScript가 속성 가시성이라는 개념을 변경하지 않았습니다. 당신이 묘사 한 것은 "해킹"입니다. 비슷한 것을 달성하기. 그러나 실제로 이것은 다른 문제를 소개합니다 ... –

답변

6

은 당신이 뭔가를 할 것입니다.

편집 : 진정한 '개인'변수로 업데이트.

+0

당신의 코드는 제 3자가 값을 변경하지 못하도록 PHP 코드에서 사용하는이 축소 된 버전에 영감을주었습니다 'var e = function() {var i = '$ data'; this.z = 변수는 tz() 또는 임의의 문자로 호출 할 수 있습니다.이 함수는() {return i;};}; var g = function() {}; g.prototype = new e(); 너는 그것을 준다. – Tschallacka

+5

흠 .. 개인 변수와 공용 변수/메소드를 만드는 것처럼 보이지만 실제로는 아무것도 보호되지 않습니다. 예를 들면 다음과 같습니다 :'var busyBody = new OtherGuy(); var innocentBase = new Base(); busyBody.stolenVar = innocentBase.GetVariable(); 즉, 제 3자가'Base' 인스턴스에서'GetVariable' 메서드를 호출하는 것을 멈추는 것은 아무것도 없습니다. – eschwartz

+0

정확하다. GetVariable과 SetVariable은 public 메소드이다. 'somePrivateVariable'은 직접 노출되지 않습니다. – Tejs

4

는 자바 스크립트로 보호 된 변수를 정의하는 방법이있다 :

모든 객체 (안 necesserily )를 반환 할 수 있습니다 자바 스크립트의 생성자 함수입니다. "실제"인스턴스 객체의 "실제"메소드에 프록시 메소드가 포함 된 프록시 객체를 반환하는 생성자 함수를 만들 수 있습니다. 이것은 복잡하게 들릴지 모르지만 그렇지 않습니다. 여기에 코드입니다 :

var MyClass = function() { 
    var instanceObj = this; 
    var proxyObj = { 
     myPublicMethod: function() { 
      return instanceObj.myPublicMethod.apply(instanceObj, arguments); 
     } 
    } 
    return proxyObj; 
}; 
MyClass.prototype = { 
    _myPrivateMethod: function() { 
     ... 
    }, 
    myPublicMethod: function() { 
     ... 
    } 
}; 

좋은 것은 우리가 보호 방법을 명명하기위한 규칙을 정의 할 경우 프록시 생성을 자동화 할 수 있다는 것입니다. 나는 정확히 이것을 수행하는 작은 라이브러리를 만들었습니다 : http://idya.github.com/oolib/

+0

이것은 보호 된 속성이 아닌 개인 속성을 에뮬레이트하는 것으로 보입니다. –

관련 문제