다른 사람의 JavaScript 코드를 다시 고려했습니다.`prototype`과`new`에서 클로저와 노출 패턴으로 이동
전 :
function SomeObj(flag) {
var _private = true;
this.flag = (flag) ? true : false;
this.version="1.1 (prototype)";
if (!this._someProperty) this._init();
// leading underscore hints at what should be a 'private' to me
this.reset(); // assumes reset has been added...
}
SomeObj.prototype.reset = function() {
/* perform some actions */
}
/* UPDATE */
SomeObj.prototype.getPrivate = function() {
return _private; // will return undefined
}
/* ...several other functions appended via `prototype`...*/
AFTER : 첫 번째 예는 어려운 보이는 나를 위해
var SomeObj = function (flag) {
var _private = true;
this.flag = (flag) ? true : false;
this.version = "2.0 (constructor)";
this.reset = function() {
/* perform some actions */
};
/* UPDATE */
this.getPrivate = function() {
return _private; // will return true
}
/* other functions and function calls here */
}
특히 더 큰 맥락에서 읽을 수 있습니다. reset
과 같은 메서드를 prototype
속성을 사용하여 추가하는 것은 스크립트의 어느 위치에서나 발생할 수 있으므로 제어가 덜한 것처럼 보입니다. 내 리팩토링 된 코드 (위의 두 번째 예제)는 나에게 훨씬 깔끔하게 보이므로 독점적이기 때문에 읽기가 쉽습니다. 변수 선언을 통해 개인 정보를 얻었지만 프로토 타입 체인의 가능성을 잃어 버렸습니다.
질문 : 첫째
, 나는 내가
prototype
를 전술에 의해 잃은 사람을 알고 관심, 또는의 손실에 더 큰 의미가있는 경우 프로토 타입 체인. This article은 6 세이지만,prototype
속성을 사용하면 클로저 패턴보다 훨씬 더 효율적이라고 주장합니다.위의 두 예제는 여전히
new
연산자로 인스턴스화됩니다. 그들은 둘 다 '고전적'일 뿐이다. 결국 나는 심지어 모든 속성과 함수가var
으로 선언 된 모델로 옮겨 가고 싶습니다. 그리고 필요한 모든 속성과 메서드를 열어주는 객체를 반환 할 수있는 하나의 메서드가 있습니다. (폐쇄로 인해) 사적인 사람들에게 특권을 가지고있다.. 이런 식으로 뭔가 :var SomeObj = (function() { /* all the stuff mentioned above, declared as 'private' `var`s */ /* UPDATE */ var getPrivate = function() { return private; } var expose = function (flag) { // just returns `flag` for now // but could expose other properties return { flag: flag || false, // flag from argument, or default value getPrivate: getPrivate } }; return { expose: expose } })(); // IIFE // instead of having to write `var whatever = new SomeObj(true);` use... var whatever = SomeObj.expose();
상담자 '폐쇄 대 프로토 타입'해결에 StackOverflow에 대한 몇 가지 답변 (here 및 here 예를 들어)이 있습니다. 그러나
prototype
속성과 마찬가지로new
연산자가 내 코드의 효율성과 가능성 손실 (예 :instanceof
이 손실 됨)에 대한 의미가 무엇인지에 관심이 있습니다. 어쨌든 프로토 타입 상속을 사용하지 않을 경우 실제로new
연산자를 사용하면 아무 것도 잃지 않습니까?나는 내가 위에서 구체적인 요구하고있어 주어진 허용하고있어 경우 느슨한 질문 :
prototype
및new
정말 폐쇄보다 (당신은 그들이있을 것 같아요 무엇이든) 더 장점으로 갈 수있는 가장 효율적인 방법이 있다면 , 거기에 깔끔한 방식으로 그들을 작성하기위한 지침이나 디자인 패턴이 있습니까?
...
UPDATE :
expose
이 때마다 새로운 개체를 반환하기 때문에 인스턴스가 일어나는 곳이하는 것으로
.이 개체가 SomeObj
클로저에 선언 된 메서드를 참조하는 곳에서이 점을 이해하면 덮어 쓰지 않는 한 모든 개체에서 동일한 메서드입니다. flag
변수의 경우 (지금 수정했습니다), 이는 expose
의 인수에서 상속되거나, 기본값을 가지거나, 다시 캡슐화 된 기존의 메소드 또는 특성을 다시 참조 할 수 있습니다. 그래서 생성되는 객체의 인스턴스가 있고 거기에 어떤 상속 (더하기 다형성?)이 있습니다.
질문 2를 반복하십시오. 어쨌든 프로토 타입 상속을 사용하지 않을 경우 실제로 new
연산자를 사용하면 아무 것도 잃지 않습니까?
지금까지 많은 질문에 답변 해 주신 데 대해 감사드립니다.
일부 토론에서 암시 된 방향으로 움직이는 것처럼 보였으므로이 블로그 항목을 읽으시 길 바랍니다. http://ejohn.org/blog/simple- class-instantiation/ –
두 번째 예제에서'instanceof'를 사용할 수있는 능력을 잃지 않았으므로 일반 객체를 반환하는 세 번째 객체 만 특수 상속에 대해 테스트 할 수 없습니다. – Bergi
@ MarkSchultheiss +1 기사 링크를 제공해 주셔서 감사합니다. 지금까지 유용한 점들. 그 반쯤은 사람들이 남긴 모든 관대 한 대답을 읽었습니다. – guypursey