2013-01-06 3 views
2

저는 생성자 모듈 패턴을 사용하여 개인 속성에 액세스하는 방법을 찾고 있습니다. 나는 작동하는 솔루션을 생각해 냈지만 이것이 최적이라고 확신하지는 않습니다.javascript 모듈 패턴에서 함수 프로토 타입의 private 속성에 어떻게 액세스합니까?

mynamespace.test = function() { 
    var s = null; 

    // constructor function. 
    var Constr = function() { 
     //this.s = null; 

    }; 

    Constr.prototype.get = function() { 
     return s; 
    }; 

    Constr.prototype.set = function (s_arg) { 
     s = s_arg; 
    }; 

    // return the constructor. 
    return new Constr; 
}; 


var x1 = new mynamespace.test(); 
var x2 = new mynamespace.test(); 
x1.set('x1'); 
alert('x1 get:' + x1.get()); // returns x1 
x2.set('x2'); 
alert('x2 get:' + x2.get()); // returns x2 
alert('x1 get: ' + x1.get()); // returns x1 
+0

현재 JavaScript가 제공하는만큼 좋습니다. 그러나 "새로운 생성자"(즉, 인스턴스)는 반환하지 말고 생성자 자체 만 반환하면됩니다 ('return Constr;). – Niko

+0

당신은 ** 최적의 *를 가질 수 없습니다 (예 :'prototype' 상속을 사용합니다). JavaScript에서 private 멤버가 숨어 있습니다. ** prototype 상속만을 사용하는 가짜 비공개 멤버 (예 :'this._imAPrivateMember')를 ** 가질 수 있습니다. 귀하의 경우, 각각의 새로운 mynamespace.test는 각각에 새로운'Contr'과'prototype' 체인을 정의합니다. – Matt

+0

도움 주셔서 감사합니다. 특정 인스턴스화를 위해 프로토 타입 함수 사이에서 공유되는 사유 속성을 저장하기 때문에 매번 새 인스턴스를 생성해야했습니다. ECMA5는 이러한 요구를 해결합니까? – user1953031

답변

0
mynamespace.Woman = function(name, age) { 
    this.name = name; 

    this.getAge = function() { 
     // you shouldn't ask a woman's age... 
     return age; 
    }; 

    this.setAge = function(value) { 
     age = value; 
    }; 
}; 

var x1 = new mynamespace.Woman("Anna", 30); 
x1.setAge(31); 
alert(x1.name); // Anna 
alert(x1.age); // undefined 
alert(x1.getAge()); // 31 

이와 솔루션의 차이는 솔루션이 새로운 생성자 | 당신이 namespace.test 호출 할 때마다()를 생성하는 것입니다. 미묘한 차이점이 있지만 여전히 선호됩니다. 차이의

하나는 당신이 사용할 수 있다는 것입니다 : 그들은 다른 생성자 |를 사용하기 때문에

x1 instanceof mynamespace.Woman 

은 솔루션 반면, X1의 유형, X2는 다른 것입니다.

관련 문제