어떻게 Javascript로 단일 모드를 실현합니까

개요


단일 모드도 단일 모드라고 하는데 하나의 클래스가 하나의 실례만 있고 전역 접근점을 제공한다.
이 글을 읽기 전에 단례 모델의 개념에 대해 모호하거나 잘 모르겠지만 사실 일상적인 개발에서 단례 모델을 사용한 적이 있을 것이다.
JavaScript에는 클래스의 정의가 없습니다. 단례 모델의 특징은'유일한'과'전역 접근'입니다. 그러면 우리는 JavaScript의 전역 대상을 연상할 수 있습니다. ES6의let을 이용하여 중복 설명을 허용하지 않는 특성을 이용하여 이 두 가지 특징에 딱 맞습니다. 그렇습니다. 전역 대상은 가장 간단한 단례 모델입니다.

let obj = {
    name:" ",
    getName:function(){}
}
상술한 코드에서obj가 하나의 단례라는 것을 알 수 있다.obj는 단례 모델의 두 가지 특징에 딱 부합되기 때문에'유일'과'전역 접근 가능'이다.
그러나 우리는 이렇게 단례를 실현하는 것을 건의하지 않는다. 왜냐하면 전역 대상/전역 변수는 약간의 폐단이 있기 때문이다.
오염된 명칭 공간 (변수 이름 충돌) 유지 보수 시 관리하기 쉽지 않음 (잘못하면 덮어쓰기)

코드 구현


단순 단례 모드


분석: 하나의 실례만 있기 때문에 우리는if분지를 사용하여 판단하고 이미 존재하면 바로 되돌아오고 존재하지 않으면 새로운 실례를 만들어야 한다.

let Singleton = function(name){
    this.name = name;
    this.instance = null; 
}

Singleton.prototype.getName = function(){
    console.log(this.name);
}

Singleton.getInstance = function(name){
    if(this.instace){
        return this.instance; 
    }
    return this.instance = new Singleton(name);
}

let winner = Singleton.getInstance("winner");   //winner
console.log(winner.getName());
let sunner = Singleton.getInstance("sunner");   //winner
console.log(sunner.getName())
위 코드에서 우리는 변수 instance의 값을 통해 실례가 존재하는지 판단하고, 존재하면 바로this로 되돌려줍니다.instance, 존재하지 않으면 새 실례를 만들고 instance에 값을 부여합니다.
그러나 위의 코드는 여전히 문제가 존재한다. 왜냐하면 창설 대상의 조작과 판단 실례의 조작이 결합되어'단일 직책 원칙'에 부합되지 않기 때문이다.

개량판


사고방식: 하나의 폐쇄를 통해 실례를 판단하는 조작을 실현한다.
가방 닫기 경고: 가방 닫는 것을 이해하지 못하는 학생은 먼저 가방 닫는 것을 배우세요

let CreateSingleton = (function(){
    let instance = null;
    return function(name){
        this.name = name;
        if(instance){
            return instance
        }
        return instance = this;
    }
})()


CreateSingleton.prototype.getName = function(){
        console.log(this.name);
}

let winner = new CreateSingleton("winner");  //winner
console.log(winner.getName());
let sunner = new CreateSingleton("sunner");  //winner
console.log(sunner.getName())

에이전트 단례 모드


에이전트의 형식을 통해 창설 대상의 조작과 실례 판단의 조작을 결합 분리하여 더욱 작은 입도의 구분을 실현하고'단일 직책 원칙'에 부합한다.

let ProxyCreateSingleton = (function(){
    let instance = null;
    return function(name){
        if(instance){
            return instance
        }
        return instance = new Singlton(name);
    }
})();

let Singlton = function(name){
    this.name = name;
} 

Singlton.prototype.getName = function(){
    console.log(this.name);
}

let winner = new ProxyCreateSingleton("winner");
console.log(winner.getName());
let sunner = new ProxyCreateSingleton("sunner");
console.log(sunner.getName());
위의 코드에서 Proxy Create Singleton()은 실례를 판단하고 Singlton은 대상과 값을 만드는 것만 책임진다.

불활성 단례 모드


우리는 자주 이런 장면을 볼 수 있다. 페이지가 여러 번 호출되면 모두 탄창 알림이 있는데 알림 내용이 다르다.
이때 우리는 즉시 단례 모델이라고 생각할 수 있다. 탄창은 단례 실례이고 제시 내용은 매개 변수 전달이다.우리는 타성 단례 모델로 그것을 실현할 수 있다.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
</head>
<body>
    <div id="loginBtn"> </div>
</body>
<script>
let getSingleton = function(fn) {
    var result;
    return function() {
        return result || (result = fn.apply(this, arguments)); //  this 
    }
}
let createAlertMessage = function(html) {
    var div = document.createElement('div');
    div.innerHTML = html;
    div.style.display = 'none';
    document.body.appendChild(div);
    return div;
}

let createSingleAlertMessage = getSingleton(createAlertMessage);
    document.getElementById('loginBtn').onclick=function(){
        let alertMessage = createSingleAlertMessage(' ');
        alertMessage.style.display = 'block';
    }
</script>
</html>
타성 단례는 페이지가 불러오기 시작했을 때 우리의 실례가 만들어지지 않은 것을 가리킨다. 우리가 페이지의div를 클릭한 후에야 실례를 만들기 시작하는 것이다. 이것은 우리의 웹 성능을 향상시키고 우리의 페이지 렌더링 속도를 높일 수 있다.
이상은 자바스크립트로 어떻게 단일 모드를 실현하는지에 대한 상세한 내용입니다. 자바스크립트 단일 모드에 대한 더 많은 자료는 저희 다른 관련 글에 주목하세요!

좋은 웹페이지 즐겨찾기