2012-04-08 1 views
2

나는 clojure를 통해 javascript에서 private 변수를 만드는 방법을 궁금해했다. 그러나 Object.create을 사용할 때 여전히 복제해야합니다. 자바 개인 변수 + Object.create (클로저 변수에 대한 참조)

var point = {}; 
(function(){ 
    var x, y; 
    x = 0; 
    y = 0; 
Object.defineProperties(point, { 
    "x": { 
     set: function (value) { 
     x = value; 
     }, 
     get: function() { 
     return x; 
     } 
    }, 
    "y": { 
     set: function (value) { 
     y = value; 
     }, 
     get: function() { 
     return y; 
     } 
    } 
    }); 
}()); 

var p1 = Object.create(point); 
p1.x = 100; 
console.log(p1.x); // = 100 
var p2 = Object.create(point); 
p2.x = 200; 
console.log(p2.x); //= 200 
console.log(p1.x); //= 200 

나는 http://ejohn.org/blog/ecmascript-5-objects-and-properties/에서이 기술을 가지고 있지만 폐쇄 변수는 모든 객체에 동일이 제한을 얻었다. 자바 스크립트 에서이 동작을 알고 있지만 어떻게 사실 개인 변수를 만들 수 있습니까?

+0

자동 생성 보이는이 코드가 테스트되었습니다? – Raynos

+0

아니, 왜 자동 생성 된 것 같지 않은가요? – automaticoo

+0

개인 변수가없는 대안으로 http://jsfiddle.net/heera/G9E9m/ –

답변

3

JavaScript에서의이 동작을 알고 있지만 어떻게 실제 개인 변수를 만들 수 있습니까?

ES5에는 개인 정보가 없습니다. 원하는 경우 ES6 개인 이름을 사용할 수 있습니다.

ES6의 비공개 이름은 ES5에서 잘릴 수있는 ES6 WeakMaps로 에뮬레이션 할 수 있습니다. 이것은 비싸고 못생긴 에뮬레이션입니다. 비용이 들지 않습니다.

+0

일 수 있습니다. 개인 변수가없는 대체 방법으로 http://jsfiddle.net/heera/G9E9m/이 될 수 있습니다. –

0

당신이 Object.create로 만들어진 하나의 객체에 private 변수를 추가해야 할 경우이를 만들 수 있습니다

var parent = { x: 0 } 
var son = Object.create(parent) 
son.init_private = function() 
{ 
    var private = 0; 
    this.print_and_increment_private = function()  
    { 
     print(private++); 
    } 
} 
son.init_private() 
// now we can reach parent.x, son.x, son.print_and_increment_private but not son.private 

을 당신도이 같은 불필요한 공공 기능 init_private을 피할 수 원하는 경우 : 를

(function()                                                  
{                                                    
    var private = 0; 
    this.print_and_increment = function() 
    { 
     print(private++); 
    } 
} 
).call(son) 

나쁜 것은 당신이 여러 통화로 개인 회원을 추가하지 수 있다는 것입니다. 좋은 점은이 방법이 제 의견으로는 매우 직관적이라는 것입니다.

이 코드 은이 Clojure의 코드에 의해 생성 된, 코뿔소 1.7 릴리스 3 2013 01 27