[js 고수 의 길]단일 모드 구현 모드 상자 의 예시
하나예:바로 실례 화 된 대상 이다.그것 을 합치 면 하나의 구조 함수 가 새로운 실례 만 낼 수 있 도록 보장 하 는 것 이다.왜 단일 모드 를 배 워 야 하 는가?또는 단일 모드 에는 어떤 흔히 볼 수 있 는 응용 장면 이 있 습 니까?그것 의 사용 은 아직도 광범 위 합 니 다.예 를 들 어 하나의 모드 상 자 를 팝 업 합 니 다.일반적으로 사이트 에서 팝 업 되 는 모드 상 자 는 계속 클릭 하고 보통 하나만 만 들 수 있 습 니 다.그리고 백 엔 드 의 데이터베이스 연결 은 일반적으로 하나의 연결 을 보장 하 는 등 이다.오늘 의 주 제 는 바로 하나의 예 가 모드 상자 에서 의 응용 이다.우 리 는 먼저 하나의 예 를 어떻게 만 드 는 지 알 아야 한다.
우 리 는 먼저 일반적인 구조 함수 와 원형 방식 을 살 펴 보 자.다음은 흔 한 방식 입 니 다.
function Singleton ( uName ){
this.userName = uName;
this.ins = null;
}
Singleton.prototype.showUserName = function(){
return this.userName;
}
var obj1 = new Singleton( 'ghostwu' );
var obj2 = new Singleton( 'ghostwu2' );
console.log( obj1 === obj2 ); //false
매번 new 는 메모리 에 새로운 메모리 영역 을 생 성하 여 새로운 인 스 턴 스 를 저장 합 니 다.따라서 이 방식 은 new 만 하나의 예 를 낼 수 있다 는 것 을 보장 할 수 없습니다.그래서 우 리 는 하나의 예 를 만 들 려 면 new 가 인 스 턴 스 를 만 드 는 과정 을 제어 할 수 있어 야 합 니 다!!이것 이 바로 단일 사례 의 관건 이다.그러면 이 과정 을 통제 하려 면 사용자 가 구조 함 수 를 직접 호출 하 게 해 서 는 안 되 기 때문에 우 리 는 다른 방법 을 생각해 야 한다.첫 번 째 방법:함수 에 정적 방법 을 추가 하여 인 스 턴 스 를 만 드 는 과정 을 제어 합 니 다.
function Singleton ( uName ){
this.userName = uName;
}
Singleton.prototype.showUserName = function(){
return this.userName;
}
Singleton.getInstance = function( uName ){
if ( !this.ins ) {
this.ins = new Singleton( uName );
}
return this.ins;
}
var obj1 = Singleton.getInstance( 'ghostwu' );
var obj2 = Singleton.getInstance( 'ghostwu2' );
console.log( obj1 === obj2 ); //true
여덟 번 째 줄 은 인 스 턴 스 라 는 변수 가 인 스 턴 스 를 저 장 했 는 지 여 부 를 판단 합 니 다.없 으 면 new 로 돌아 갑 니 다.그렇지 않 으 면 바로 돌아 갑 니 다.두 번 째 호출 시 인 스 가 이미 존재 하기 때문에 바로 돌아 오 면 new 가 필요 없습니다.이것 은 하나의 예 를 확보 할 수 있 습 니 다.두 번 째 방법:폐쇄 와 즉각 표현 식 의 특성 을 이용 합 니 다.
function Singleton ( uName ){
this.userName = uName;
}
Singleton.prototype.showUserName = function(){
return this.userName;
}
Singleton.getInstance = (function(){
var ins = null;
return function( uName ) {
if ( !ins ) {
ins = new Singleton( uName );
}
return this;
}
})();
var obj1 = Singleton.getInstance( 'ghostwu' );
var obj2 = Singleton.getInstance( 'ghostwu2' );
console.log( obj1 === obj2 );
이 두 가지 방법 은 모두 가능 하 다.그 다음 에 나 는 두 번 째 방법 을 선택 하여 팝 업 단일 한 모드 상 자 를 실현 할 것 이다.3.전통 적 으로 대상 을 대상 으로 하 는 방식 으로 클릭 할 때마다 새로운 모드 상자 가 나타 납 니 다.
스타일:
div {
width: 200px;
height: 200px;
border:1px solid #09f;
box-shadow: 2px 2px 1px #666;
position: absolute;
}
html:
<input type="button" value=" ">
js 부분:
var oBtn = document.querySelector("input"),
offset = 20, index = 1;
function Module( pos ){
this.offset = pos || 20;
}
Module.prototype.create = function(){
var oDiv = document.createElement( "div" );
oDiv.style.left = ( ++index ) * offset + 'px';
oDiv.style.top = ( ++index ) * offset + 'px';
oDiv.innerHTML = 'ghostwu ';
return oDiv;
}
oBtn.onclick = function(){
var oDiv = new Module();
document.body.appendChild( oDiv.create() );
}
넷 째,단일 사례 로 개조 한다.
html:
<input type="button" value=" 1">
<input type="button" value=" 2">
var aBtn = document.querySelectorAll("input"),
offset = 20, index = 1;
function Module( pos ){
this.offset = pos || 20;
}
Module.prototype.create = function(){
var oDiv = document.createElement( "div" );
oDiv.style.left = ( ++index ) * offset + 'px';
oDiv.style.top = ( ++index ) * offset + 'px';
oDiv.innerHTML = 'ghostwu ';
return oDiv;
}
Module.one = (function(){
var ins = null, isExist = false;
return function( pos ){
if ( !ins ) ins = new Module( pos );
if ( !isExist ) {
document.body.appendChild( ins.create() );
isExist = true;
}
}
})();
aBtn[0].onclick = function(){
Module.one( 10 );
}
aBtn[1].onclick = function(){
Module.one( 10 );
}
Module.one 에 서 는 변수 isExist 의 두 가지 상태 와 패 킷 특성 제어 요 소 를 한 번 만 추가 할 수 있 습 니 다.이상 의[js 고수 의 길]단일 모델 이 모드 상 자 를 실현 하 는 예 는 바로 소 편 이 여러분 에 게 공유 한 모든 내용 입 니 다.여러분 께 참고 가 되 고 여러분 들 이 저 희 를 많이 응원 해 주 셨 으 면 좋 겠 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
[2022.04.19] 자바스크립트 this - 생성자 함수와 이벤트리스너에서의 this18일에 this에 대해 공부하면서 적었던 일반적인 함수나 객체에서의 this가 아닌 오늘은 이벤트리스너와 생성자 함수 안에서의 this를 살펴보기로 했다. new 키워드를 붙여 함수를 생성자로 사용할 때 this는...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.