js 단일 디자인 모델
4. 567917. 단일 모델 의 정 의 는 하나의 인 스 턴 스 만 있 고 전체 방문 점 을 제공 하 는 것 이다
4. 567917. 단일 모델 은 자주 사용 하 는 모델 로 일부 대상 은 우리 가 스 레 드 탱크, 전체 캐 시, 브 라 우 저 중의 window 대상 등 만 필요 하 다.자바 스 크 립 트 개발 에 있어 서 단일 모델 의 용도 도 매우 광범 위 하 다.로그 인 단 추 를 누 르 면 페이지 에 로그 인 창 이 나타 납 니 다. 이 로그 인 창 은 유일한 것 입 니 다. 로그 인 단 추 를 몇 번 누 르 더 라 도 이 창 은 한 번 만 만들어 집 니 다. 그러면 이 로그 인 창 은 단일 모드 로 만 들 기 에 적합 합 니 다
본문
1. JavaScript 에서 단일 사례 를 실현 하 는 방식 은 여러 가지 가 있 습 니 다. 그 중에서 가장 간단 한 방법 은 대상 의 글자 크기 를 사용 하 는 방법 입 니 다. 그 글자 의 양 에는 대량의 속성 과 방법 이 포함 되 어 있 습 니 다.
var mySingleton = {
property1: "something",
property2: "something else",
method1: function () {
console.log('hello world');
}
};
2. 패 킷 을 사용 하여 개인 변 수 를 밀봉 합 니 다. 이런 방법 으로 일부 변 수 를 패 킷 내부 에 밀봉 하고 일부 인터페이스 만 외부 와 통신 합 니 다.
var user = (function(){
var __name = 'sven',
__age = 29;
return {
getUserInfo: function(){
return __name + '-' + __age;
}
}
})();
우 리 는 밑줄 로 사유 변 수 를 약정 합 니 다name 와age, 패키지 가 발생 하 는 역할 영역 에 봉인 되 어 있 습 니 다. 외부 에 서 는 이 두 변 수 를 접근 할 수 없습니다. 이 는 전체 명령 에 대한 오염 을 피 할 수 있 습 니 다.
타성
타성 단 예 는 필요 할 때 만 대상 인 스 턴 스 를 만 드 는 것 을 말한다.
var createLoginLayer = function(){
var div = document.createElement( 'div' );
div.innerHTML = ' ';
div.style.display = 'none';
document.body.appendChild( div );
return div;
};
document.getElementById( 'loginBtn' ).onclick = function(){
var loginLayer = createLoginLayer();
loginLayer.style.display = 'block';
};
지금 은 타성 적 인 목적 을 달 성 했 지만 단 례 의 효 과 를 잃 었 다.로그 인 단 추 를 누 를 때마다 새 로그 인 창 div 를 만 듭 니 다.비록 우 리 는 부 창 에 있 는 닫 기 단 추 를 눌 렀 을 때 (여기 서 실현 되 지 않 음) 이 부 창 을 페이지 에서 삭제 할 수 있 지만 이렇게 자주 노드 를 만 들 고 삭제 하 는 것 은 분명 합 리 적 이지 않 고 불필요 하 다.
로그 인 창 을 만 들 었 는 지, 닫 힌 창 을 이 용 했 는 지 변수 로 판단 할 수 있 습 니 다.
var createLoginLayer = (function(){
var div;
return function(){
if ( !div ){
div = document.createElement( 'div' );
div.innerHTML = ' ';
div.style.display = 'none';
document.body.appendChild( div );
}
return div;
}
})();
document.getElementById( 'loginBtn' ).onclick = function(){
var loginLayer = createLoginLayer();
loginLayer.style.display = 'block';
};
다음 에 페이지 에 있 는 유일한 iframe 이나 script 탭 을 만 들 려 면 도 메 인 을 넘 어 데 이 터 를 요청 하려 면 법 대로 만들어 야 합 니 다. createLogin Layer 함 수 를 거의 한 번 베껴 야 합 니 다.
var createIframe= (function(){
var iframe;
return function(){
if ( !iframe){
iframe= document.createElement( 'iframe' );
iframe.style.display = 'none';
document.body.appendChild( iframe);
}
return iframe;
}
})();
우 리 는 변 하지 않 는 부분 을 격 리 시 켜 야 합 니 다. 먼저 div 를 만 드 는 것 과 iframe 을 만 드 는 것 이 얼마나 차이 가 있 는 지 고려 하지 않 습 니 다. 관리 사례 의 논 리 는 완전히 추상 화 될 수 있 습 니 다. 이 논 리 는 똑 같 습 니 다. 하나의 변수 로 대상 을 만 들 었 는 지 를 표시 합 니 다. 만약 에 다음 에 이미 만 든 대상 을 직접 되 돌려 줍 니 다.
var obj;
if ( !obj ){
obj = xxx;
}
이제 우 리 는 단일 사례 를 어떻게 관리 하 는 지 에 대한 논 리 를 원래 의 코드 에서 추출 합 니 다. 이러한 논 리 는 getSingle 함수 내부 에 봉인 되 어 있 고 대상 을 만 드 는 방법 fn 은 매개 변수 로 동적 으로 getSingle 함수 에 들 어 갑 니 다.
var getSingle = function( fn ){
var result;
return function(){
// result , fn
return result || ( result = fn .apply(this, arguments ) );
}
};
var createLoginLayer = function(){
var div = document.createElement( 'div' );
div.innerHTML = ' ';
div.style.display = 'none';
document.body.appendChild( div );
return div;
};
var createSingleLoginLayer = getSingle( createLoginLayer );
document.getElementById( 'loginBtn' ).onclick = function(){
// getSingle( createLoginLayer )
var loginLayer = createSingleLoginLayer();
loginLayer.style.display = 'block';
};
다음 에 유일한 iframe 을 만들어 서 제3자 페이지 를 동적 으로 불 러 오 는 데 사용 합 니 다.
var createSingleIframe = getSingle( function(){
var iframe = document.createElement ( 'iframe' );
document.body.appendChild( iframe );
return iframe;
});
document.getElementById( 'loginBtn' ).onclick = function(){
var loginLayer = createSingleIframe();
loginLayer.src = 'http://baidu.com';
};
, ,
변 화 를 세 워 서로 영향 을 주지 않 고 연결 되 었 을 때 유일한 인 스 턴 스 대상 을 만 드 는 기능 을 완 성 했 습 니 다. 신기 한 일 로 보 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.