소개하다
이 장에서 시작하여 JavaScript에 사용되는 다양한 설계 패턴 구현을 점차적으로 소개합니다. 여기서 나는 패턴 자체에 대한 이론을 너무 많이 소개하지 않지만 구현에만 초점을 맞출 것입니다. 좋아, 공식적으로 시작합니다.
전통적인 개발 엔지니어의 눈에 싱글 톤은 클래스의 사례가 하나만 있는지 확인하는 것입니다. 구현 방법은 일반적으로 인스턴스가 존재하는지 여부를 먼저 결정하는 것입니다. 존재하면 직접 반환되며 존재하지 않으면 생성 된 다음 반환되면 클래스의 인스턴스 객체가 하나뿐입니다. JavaScript에서 Singleton은 네임 스페이스 제공 업체 역할을하여 글로벌 네임 스페이스의 고유 액세스 포인트를 제공하여 객체에 액세스합니다.
텍스트
JavaScript에는 싱글 톤을 구현하는 방법에는 여러 가지가 있습니다. 가장 쉬운 방법은 문자 그럴 객체를 사용하는 것입니다. 여기에는 많은 수의 속성과 방법이 포함될 수 있습니다.
코드 사본은 다음과 같습니다.
var mysingleton = {
속성 1 : "무언가",
속성 2 : "다른 것",
방법 1 : function () {
Console.log ( 'Hello World');
}
};
나중에 객체를 확장하려면 자신의 개인 멤버 및 방법을 추가 한 다음 폐쇄를 사용하여 이러한 변수와 기능 선언을 캡슐화 할 수 있습니다. 노출하려는 공개 회원과 방법 만 노출됩니다. 샘플 코드는 다음과 같습니다.
코드 사본은 다음과 같습니다.
var mysingleton = function () {
/* 개인 변수 및 방법 선언*/
var privatevariable = 'Something Private';
함수 showprivate () {
console.log (privatevariable);
}
/ * 공개 변수 및 방법 (개인 변수 및 방법에 액세스 할 수 있습니다) */
반품 {
publicmethod : function () {
showprivate ();
},
Publicvar : '대중은 이것을 볼 수 있습니다!'
};
};
var single = mysingleton ();
Single.publicMethod (); // '비공개'출력
Console.log (Single.PublicVar); // 출력 '대중은 이것을 볼 수 있습니다!'
위의 코드는 꽤 좋지만 사용할 때만 초기화하려면 어떻게해야합니까? 자원을 저장하기 위해 다음과 같이 다른 생성자에서 이러한 코드를 초기화 할 수 있습니다.
코드 사본은 다음과 같습니다.
var singleton = (function () {
var 인스턴스화;
함수 init () {
/*여기에서 싱글 톤 코드 정의*/
반품 {
publicmethod : function () {
Console.log ( 'Hello World');
},
Publicproperty : '테스트'
};
}
반품 {
getInstance : function () {
if (! Instantated) {
Instantiated = init ();
}
인스턴스화 된 반환;
}
};
}) ();
/*인스턴스를 얻기 위해 공개 방법을 호출합니다.*/
Singleton.getInstance (). publicmethod ();
싱글 톤을 구현하는 방법을 알고 있지만 싱글 톤을 사용하는 가장 좋은 시나리오는 어떤 종류의 시나리오입니까? 실제로, 싱글 톤은 일반적으로 시스템 간의 다양한 모드 간의 통신 조정에 사용됩니다. 다음 코드는 싱글 톤의 모범 사례입니다.
코드 사본은 다음과 같습니다.
var singletontester = (function () {
// 매개 변수 : 싱글 톤으로 전달 된 매개 변수 세트
기능 싱글 톤 (Args) {
// args 변수를 수신 된 매개 변수로 설정하거나 비어 있습니다 (제공되지 않은 경우)
var args = args || {};
// 이름 매개 변수를 설정합니다
this.name = 'Singletontester';
// pointx의 값을 설정합니다
this.pointx = args.pointx || 6; // 수신 된 매개 변수에서 얻거나 기본값으로 설정
// 뾰족한 값을 설정합니다
this.pointy = args.pointy || 10;
}
// 인스턴스 컨테이너
var 인스턴스;
var _static = {
이름 : 'Singletontester',
// 인스턴스를 가져 오는 메소드
// 싱글 톤 인스턴스를 반환합니다
GetInstance : function (args) {
if (instance === 정의되지 않은) {
인스턴스 = 새로운 싱글 톤 (Args);
}
반환 인스턴스;
}
};
반환 _static;
}) ();
var singletontest = singletontester.getInstance ({pointx : 5});
Console.log (Singletontest.pointx); // 출력 5
다른 구현 방법
방법 1 : 방법 1
코드 사본은 다음과 같습니다.
기능 유니버스 () {
// 인스턴스가 있는지 여부를 결정합니다
if (Universe의 typeof.instance === 'Object') {
리턴 우주.
}
// 기타 콘텐츠
this.start_time = 0;
this.bang = "big";
// 캐시
Universe.instance = this;
// 암시 적으로 이것을 반환합니다
}
// 시험
var uni = 새로운 우주 ();
var uni2 = 새로운 우주 ();
Console.log (uni === uni2); // 진실
방법 2 : 방법 2.
코드 사본은 다음과 같습니다.
기능 유니버스 () {
// 캐시 인스턴스
var 인스턴스 = 이것;
// 기타 콘텐츠
this.start_time = 0;
this.bang = "big";
// 생성자를 다시 작성하십시오
Universe = function () {
반환 인스턴스;
};
}
// 시험
var uni = 새로운 우주 ();
var uni2 = 새로운 우주 ();
uni.bang = "123";
Console.log (uni === uni2); // 진실
Console.log (uni2.bang); // 123
메소드 3 :
코드 사본은 다음과 같습니다.
기능 유니버스 () {
// 캐시 인스턴스
var 인스턴스;
// 함수를 재구성합니다
Universe = function Universe () {
반환 인스턴스;
};
// 프로토 타입 속성의 사후 처리
Universe.prototype = this;
// 예
인스턴스 = 새로운 우주 ();
// 생성자 포인터를 재설정합니다
인스턴스 .constructor = 우주;
// 기타 기능
instance.start_time = 0;
instance.bang = "big";
반환 인스턴스;
}
// 시험
var uni = 새로운 우주 ();
var uni2 = 새로운 우주 ();
Console.log (uni === uni2); // 진실
// 프로토 타입 속성을 추가합니다
Universe.prototype.nothing = true;
var uni = 새로운 우주 ();
Universe.prototype.everythe = true;
var uni2 = 새로운 우주 ();
Console.log (uni.nothing); // 진실
Console.log (uni2.nothing); // 진실
Console.log (uni.everthing); // 진실
Console.log (uni2.everthing); // 진실
Console.log (uni.constructor === Universe); // 진실
Method 4:
코드 사본은 다음과 같습니다.
var 우주;
(기능 () {
var 인스턴스;
Universe = function Universe () {
if (인스턴스) {
반환 인스턴스;
}
인스턴스 = 이것;
// 기타 콘텐츠
this.start_time = 0;
this.bang = "big";
};
} ());
// 테스트 코드
var a = 새로운 우주 ();
var b = 새로운 우주 ();
경고 (A === B); // 진실
A.bang = "123";
경고 (B.Bang); // 123