내가 JS에 간단한 계산기 응용 프로그램을 만들어 연습을 결심만들기 개인 인스턴스의 변수에 액세스 할 프로토 타입 방법
배경입니다. 첫 번째 단계는 스택 클래스를 구현하는 것이 었습니다. 그러나 공개 프로토 타입 패턴 (?)으로 데이터 캡슐화를 달성 할 때 몇 가지 문제가 발생했습니다.
스택 "클래스":
var Stack = (function() {
var Stack = function() {
this.arr = []; // accessible to prototype methods but also to public
};
Stack.prototype = Object.prototype; // inherits from Object
Stack.prototype.push = function(x) {
this.arr.push(x);
};
Stack.prototype.pop = function() {
return this.arr.length ? (this.arr.splice(this.arr.length - 1, 1))[0] : null;
};
Stack.prototype.size = function() {
return this.arr.length;
};
Stack.prototype.empty = function() {
return this.arr.length === 0;
};
return Stack;
})();
테스트 코드를 : 여기 지금 보이는 방법
var s1 = new Stack();
var s2 = new Stack();
for(var j = 1, k = 2; j < 10, k < 11; j++, k++) {
s1.push(3*j);
s2.push(4*k);
}
console.log("s1:");
while(!s1.empty()) console.log(s1.pop());
console.log("s2:");
while(!s2.empty()) console.log(s2.pop());
문제점
유일한 문제는 arr
에 액세스 할 수 있는지입니다 . 어떻게 든 변수 arr
을 숨기고 싶습니다. 다음 arr
변수이기 때문에,
var Stack = (function() {
var arr = []; // private, but shared by all instances
var Stack = function() { };
Stack.prototype = Object.prototype;
Stack.prototype.push = function(x) {
arr.push(x);
};
// etc.
})();
그러나 물론이 방법이 작동하지 않습니다 솔루션에
시도
내 첫번째 생각은 Stack
같은 개인 변수를 만드는 것이 었습니다 은 모든 인스턴스별로을 공유합니다. 따라서 개인용 클래스를 변수로 만들 수있는 좋은 방법이지만 개인 인스턴스 변수는 사용할 수 없습니다.
var Stack = (function() {
var pass = String(Math.floor(Math.pow(10, 15 * Math.random()));
var arrKey = "arr" + pass;
var Stack = function() {
this[arrKey] = []; // private instance and accessible to prototypes, but too dirty
};
Stack.prototype = Object.prototype;
Stack.prototype.push = function(x) {
this[arrKey].push(x);
};
// etc.
})();
이 솔루션 :
(읽기 쉽도록 확실히 좋은 정말 미친 짓하고) 내가 생각하는 두 번째 방법은 거의 암호처럼 배열 변수에 대한 액세스를 제한하는 임의의 숫자를 사용하는 것입니다 ... 재미 있습니다. 그러나 분명히 내가하고 싶은 것이 아닙니다.
마지막 아이디어는 Crockford does인데, 개인 인스턴스 멤버를 만들 수는 있지만 정의하고있는 공개 프로토 타입 메서드에서이를 볼 수있는 방법은 없습니다.
var Stack = (function() {
var Stack = function() {
var arr = []; // private instance member but not accessible to public methods
this.push = function(x) { arr.push(x); }; // see note [1]
}
})();
[1]이 거의 다입니다,하지만 그들은 인스턴스가 생성 될 때마다 다시 얻을 때문에 나는 var Stack = function() {...}
내에서 함수 정의를 갖고 싶어하지 않습니다. 똑똑한 JS 컴파일러는 어떤 조건에 의존하지 않고 this.push
을 반복해서 작성하는 대신 기능 코드를 캐시하지 않는다는 것을 깨닫게 될 것입니다. 그러나 피할 수 있다면 추측 캐싱에 의존하지 않을 것입니다.
[질문
프로토 타입 방법에 액세스 할 수있는 개인 인스턴스 멤버를 만들 수있는 방법이 있나요? 어떻게 든 둘러싸고있는 익명의 기능에 의해 형성된 '영향의 거품'을 이용함으로써?
Douglas Crockford는 괄호 안에 함수를 래핑 할 때 대신'})();'dogballs를 고려하고'}());을 추천합니다. http://www.youtube.com/watch?v=eGArABpLy0k –
권한있는 함수 당 모든 인스턴스에 대해 클로저를 만들지 않아야합니다.여기에 더 많은 코드가 있지만 클로저가 적은 protected 패턴이 있습니다. http://stackoverflow.com/questions/21799353/pseudo-classical-inheritance-with-privacy/21800194#21800194 – HMR
@HMR 아래에서 내 새로운 대답을 봅니다. 기본적으로 연결 한 것과 같습니다. 부끄러움 나는 당신이 처음 게시 할 때 그것을 이해하지 못했다. –