1. 글로벌 변수를 사용하여 단일 케이스를 저장하십시오
이것은 그것을 구현하는 가장 쉬운 방법입니다
function person () {this.createTime = new Date (); } var instance = new Person (); 함수 getInstance () {return instance; }이 JS를로드 할 때 개인 객체가 생성되어 인스턴스 글로벌 변수에 저장됩니다. 이 객체는 사용될 때마다 가져옵니다. 한 번 사용하지 않았다면 생성 한 객체가 낭비되면 최적화 할 수 있습니다.
var instance function getInstance () {if (! instance) {instance = new person (); } return 인스턴스; }이런 식으로, 객체는 처음으로 사용될 때만 생성됩니다.
이 방법의 단점은 인스턴스가 글로벌 변수라는 것입니다. 여러 사람이 협력하거나 개발주기가 비교적 길면 다른 코드에 의해 인스턴스를 수정하거나 덮어 쓰지 않도록하기가 어렵습니다. 호출을 호출 할 때 인스턴스가 사람이 전혀 객체가 아닌 것으로 나타났습니다.
클로저를 사용하여 인스턴스를 캡슐화하여 더 이상이 문제를 해결하는 글로벌 변수가 아님을 고려해 봅시다.
2. 클로저 생성 객체
var getInstance () {var 인스턴스; return function () {if (! instance) {instance = new Person (); } return 인스턴스; }} ();이러한 방식으로 인스턴스가 캡슐화되고 수정 될까 걱정할 필요가 없습니다.
이제 getInstance () 함수를 통해 싱글 톤을 얻을 수 있습니다. 새로운 질문, 새로운 사람 ()을 통해 객체를 만들면 여전히 여러 개의 객체를 얻고 JavaScript는 Java와 같은 생성자를 민영화 할 수 없습니다. 그렇다면 어떻게 새로운 객체를 여러 번 인스턴스로 만들 수 있습니까?
3. 생성자의 정적 속성 캐시 인스턴스
코드를 먼저보십시오
function person () {// 인스턴스가 캐시 된 경우 캐시 된 인스턴스를 직접 반환합니다. } this.createTime = 새 날짜 (); // 캐시 된 인스턴스 person.instance = this; 이것을 반환하십시오; }코드에서, 우리는 처음 새롭게 IF Returns False의 조건이 아래로 내려 가서 개체를 초기화 한 다음 객체를 정적 속성 담당자에게 저장한다는 것을 알 수 있습니다.
두 번째로 새로운 경우 IF RETURNS TRUE의 조건은 사람을 직접 반환하며 초기화 된 코드는 다운되지 않습니다. 따라서 몇 번의 새로운 경우에도 반환 된 객체는 최초의 생성 된 객체입니다.
이 방법의 단점은 방법 1의 단점과 동일합니다. person.instance는 또한 공공 재산이며 수정 될 수 있습니다.
방법 2를 참조하자. 클로저를 사용하여 캡슐화를 사용하여 문제를 해결할 수 있습니다.
4. 생성자를 다시 작성하십시오
이 방법은 클로저를 사용해야하지만 방법 2만큼 간단 할 수는 없습니다. 생성자를 무시해야합니다.
function person () {// 캐시 된 인스턴스 var instance = this; this.createTime = 새 날짜 (); // 생성자 인 person = function () {return instance; }}처음으로 새로 호출되면 원래 생성자가 먼저 캐시 된 다음 초기화되고 생성자가 무시됩니다. 미래에 새로 새로운 경우 원래 생성자를 호출하지 않고 다시 쓰기 생성자를 호출 할 수 있으며이 기능은 항상 캐시 된 인스턴스를 반환합니다.
위의 방법은 괜찮은 것 같지만 다음 테스트를 통해 문제를 찾을 수 있습니다.
// 속성 추가 person.prototype.prop1 = true; var p1 = 새로운 사람 (); // 초기화 객체를 작성한 후 attribute person.prototype.prop2 = true를 추가하십시오. var p2 = 새로운 사람 (); // test console.log (p1.prop1); // 결과는 true console.log (p2.prop1); // 결과는 true console.log (p1.prop2); // 결과는 undefined console.log (p2.prop2); // 결과는 정의 된 console.log (p2.prop2)입니다. console.log (p1.constructor === person); // 결과는 false console.log (p2.constructor === person); // 결과는 false입니다
예상 결과는 사실이어야합니다.
위의 테스트 코드를 분석하십시오
person.prototype.prop1 = true; 원래 생성자의 프로토 타입 아래에 prop1 속성을 추가하고 값을 할당합니다.
var p1 = new Person ()을 실행 한 후 사람 생성자가 다시 작성되었습니다.
따라서 person.prototype.prop2 = true; 새로운 프로토 타입에 Prop2 속성을 추가합니다.
var p2 = 새로운 사람 (); P2와 P1은 실제로 동일한 객체, 즉 원래 생성자가 만든 객체입니다.
따라서 P1과 P2에는 속성 Prop1이 있지만 속성 Prop2는 없습니다.
마찬가지로, P1 및 P2의 생성자는 원래 생성자를 가리키며,이 시점에서 사람은 더 이상 원래 기능이 아닙니다.
예상대로 실행하려면 일부 수정을 달성 할 수 있습니다.
function person () {// 캐시 된 인스턴스 var instance = this; // 생성자를 다시 작성하십시오 person = function () {return instance; } // 프로토 타입 속성을 예약합니다. person.prototype = this; // instance = new Person (); // 생성자 참조 인스턴스를 재설정합니다 .constructor = person; // 기타 초기화 인스턴스 .createTime = 새 날짜 (); 반환 인스턴스; }이전 테스트 코드를 실행하면 결과가 사실입니다.
5. 게으른 하중 :
대규모 또는 복잡한 프로젝트에서 최적화 역할을 수행합니다. 비싸지 만 드물게 사용되지 않는 구성 요소는 게으른 로딩 싱글 톤, 예제 프로그램으로 싸울 수 있습니다.
/ * 개인 회원이있는 싱글 톤, 3 단계. */mynamespace.singleton = (function () {// private members. var privateattribute1 = fird; fivateattribute1 = fivateattribute2 = [1, 2, 3]; fublatemethod1 () {...} 함수 privatemethod2 (args) {... ... reture reture {// public embers1. publicmethod1 : function () {...}, publicmethod2 : function (args) {... ...}};}) ();/ * 게으른로드 싱글 톤, 1 단계에 대한 일반 골격. */mynamespace.singleton = (function () {function constructor () {// 정상적인 싱글 톤 코드는 여기에 있습니다. privateattribute2 = [1, 2, 3]; 게으른로드 싱글 톤, 2 단계. */mynamespace.singleton = (function () {function () {// 모든 일반 싱글 톤 코드가 여기로 이동합니다. (function () {var itormantonstance; // 단일 인스턴스를 보유하는 개인 속성. 함수 constructor () {// 모든 일반 싱글 톤 코드가 여기로 이동합니다. ...} return {getInstance : infortment (! 고유 인스턴스) {// 인스턴스가 존재하지 않는 경우에만 인스턴스를 인스턴스화합니다.6. Branch Singleton 사용 :
특정 환경에 대한 코드는 분기 싱글 톤, 샘플 프로그램으로 싸울 수 있습니다.
/ * simplexhrfactory singleton, 1 단계. */var simplexhrfactory = (function () {// 세 가지 분기. var 표준 = {createxhrobject : vunction () {return new xmlhttprequest ();}}; var activexhrobject : inctiveBject : inctiveBject ( 'msxMl2.xmlht); }}; var activexold = {createxhrobject : function () {return new ActiveXobject ( 'microsoft.xmlhttp');/ * simplexhrfactory 싱글 턴, 2 단계. xmlhtprequest () {createxhrobject () { 'msxml2.xmlhttp'); BRING을 시도하십시오. var testobject를 시도하십시오 activexold.createxhrobject ();