소프트웨어 개발 모델로서, 모 놀리 식 패턴은 많은 객체 지향 언어로 널리 사용되었습니다. JavaScript에서는 모 놀리 식 패턴도 널리 사용됩니다. 그러나 JavaScript 언어에는 고유 한 객체 지향 방법이 있기 때문에 일부 전통적인 객체 지향 언어와 일치하지만 여전히 구현에서는 다릅니다.
먼저, 전통적인 객체 지향 언어로 단량체 패턴의 정의를 살펴 보겠습니다. 단량체 패턴은 한 번만 인스턴스화 할 수 있고 잘 알려진 액세스 포인트를 통해 액세스 할 수있는 클래스입니다. 이 정의에는 전통적인 객체 지향 언어의 특성, 즉 클래스 및 인스턴스화를 강조하는 두 가지 점이 있습니다. 따라서 전통적인 객체 지향 언어의 경우 모 놀리 식 패턴은 계급과 인스턴스화의 자연적인 특성을 기반으로합니다. 즉, 키워드 클래스를 사용하여 새로운 키워드를 통해 인스턴스화 할 수있는 클래스를 정의하지만 새로운 인스턴스에 의해 인스턴스를 인스턴스화 할 때마다 동일한 인스턴스를 얻거나 해당 생성자를 한 번만 새로운 것을 통해 호출 할 수 있는지 확인해야합니다.
JavaScript에서 단량체 패턴의 정의를 살펴 보겠습니다. 단량체는 네임 스페이스를 나누고 관련 메소드와 속성을 함께 구성하는 데 사용되는 객체입니다. 인스턴스화 할 수 있다면 한 번만 인스턴스화 할 수 있습니다. 위의 정의를 비교하면 여기서 단량체 정의는 전통적인 객체 지향 언어로 된 클래스보다는 본질을 대상으로 정의하며, 이는 JavaScript의 언어가 객체 기반임을 보여줍니다. 동시에, 나중에 인스턴스화 될 수 있다면, 이것은 자바 스크립트에서 단량체를 정의하는 몇 가지 방법이 있어야한다는 것을 보여 주었다. 인스턴스화 할 수있는 인스턴스화 방법에는 하나 이상의 방법이 있습니다. 즉, 새로운 키워드를 사용하여 단량체 객체를 만듭니다. 그러나이 방법은 JavaScript 자체의 자연스러운 기능이 아닙니다. 새로운 키워드를 사용하여 생성 된 개체는 실제로 기능을 통해 시뮬레이션되고 정의되기 때문입니다 (ES6은 클래스 키워드를 지원하기 시작했지만 아직 브라우저에서 널리 지원되지 않았습니다). 그렇다면 단량체 패턴을 구현하기 위해 JavaScript의 자연적인 특징을 사용하는 방법은 무엇입니까?
var singleton = {attribute1 : true, attribute2 : 10, method1 : function () {}, method2 : function (arg) {}}다음은 여러 속성과 방법을 포함하는 객체 싱글 톤입니다. 페이지에 포함되어 있습니다. 이 객체는 JS가로드 될 때 생성됩니다. 호출 할 때 Singleton.Method1을 사용하는 것을 사용합니다. JS 구문 분석 페이지를 실행하는 동안 인스턴스화가 완료됩니다. 우리는 새로운 키워드를 사용 하여이 개체를 인스턴스화하지 않습니다. 이것은 또한 JavaScript에서 모 놀리 식 패턴을 구현하는 것과 전통적인 객체 지향 언어의 큰 차이입니다. 이 방법은 더 간단하고 이해하기 쉽습니다. 그러나이 방법에는 몇 가지 단점이 있습니다. 명백한 단점 중 하나는 네임 스페이스를 제공하지 않는다는 것입니다. 다른 프로그래머가 페이지에서 싱글 톤 변수를 정의하는 경우 모 놀리 식 객체를 덮어 쓰고 혼동하기 쉽습니다. 따라서이 문제의 경우 다음과 같이 다시 작성됩니다.
var myspace = {}; mySpace.singleton = {attribute1 : true, attribute2 : 10, method1 : function () {}, method2 : function (arg) {}}여기서 MySpace 네임 스페이스가 먼저 정의 된 다음 단일 객체 싱글 톤 이이 객체 아래에 장착되어 다른 프로그래머 및 오해와의 충돌 가능성이 크게 줄어 듭니다. 다른 사람들이 글로벌 범위에서 싱글 톤 변수를 정의하더라도 싱글 톤 객체를 오염시키지 않습니다. 이것은 네임 스페이스를 나누고 이전 정의에서 언급 한 바와 같이 일부 관련 속성과 방법을 구성하는 기능을 구현합니다.
이 방법에는 여전히 단점이 있습니다. 이 모 놀리 식 물체의 모든 특성과 방법은 공유되며 외부에서 언제든지 액세스하고 수정할 수 있습니다. 따라서 클로저는 다음과 같이 개인 속성 및 방법을 시뮬레이션하는 데 사용됩니다.
MySpace.singleton = (function () {var privateattribute1 = false; var privateattribute1 = [1,2,3]; fivatemethed1 () {} function privatemethod2 () {} return {publicattribute1 : true, publicattribute2 : 10, publicmethatt1 (privateatt1);); publicmethod2 : function (arg) {privateattribute1 = [4,5,6];여기서 우리는 Monolith 객체에 익명의 자체 실행 기능을 직접 할당합니다. 이 기능에서 VAR 및 기능 키워드는 각각 개인 속성과 방법을 정의하는 데 사용됩니다. 함수가 실행되면 내부 범위의 공간이 재활용되기 때문에 함수 외부 (Monolith Object 외부) 외부에서 직접 액세스 할 수 없으므로 폐쇄를 사용하여 개인 특성 및 방법을 시뮬레이션 할 수 있습니다. 이 기능 (폐쇄)에서 객체가 최종적으로 반환되며, 여기에는 일부 공개 방법과 속성이 포함되어 있으며 바로 외부에서 호출 할 수 있습니다. 동시에, 이러한 공개 방법은 함수 내부에서 정의되므로 개인 속성과 방법을 호출 할 수 있습니다. 그러나 외부 세계는 반환 된 공개 방법과 속성을 통해서만 특정 작업을 완료 할 수 있으며 Singleton.privatemethod1과 같은 속성을 직접 호출 할 수 없습니다. 이로 인해 모 놀리 식 물체는 외부 세계를 분리하여 개인 특성과 방법에 직접 액세스 할뿐만 아니라 외부 세계에 특정 속성과 방법을 제공하여 특정 작업을 완료합니다.
익명 기능의 자기 실행에 의해 구성된이 모 놀리 식 패턴은 많은 JS 라이브러리에서 널리 사용되지만 여전히 문제가 있습니다. 페이지를로드 할 때 객체를 사용할 필요가없고 객체의 생성이 더 비싸다면 (예 : 많은 계산 또는 DOM 트리 및 그 속성에 대한 여러 액세스 등) JS의 구문 분석 및 실행으로 직접 작성하는 대신 필요할 때 제작하는 것이 합리적입니다. 이 개념은 게으른 하중이라고하므로 위의 코드를 다음과 같이 수정하십시오.
mySpace.singleton = (function () {var incientInstance; function constructor () {var privateAttribute1 = false; var privateAttribute1 = [1,2,3]; 함수 privatemethod1 () {} 함수 privateMethod2 () {} return {publicattribute1 : true, publicattribute2 : 10, function1 : function1 : publicattribute2 : 10. PrivateTeTe11 = publicmethod2 : publateTtribute1 = [4,5,6];여기서, 개인 변수 고유의 경우는 익명 함수에서 모 놀리 식 객체가 생성되었는지 여부를 결정하기위한 핸들로 정의됩니다. 그런 다음, 모 놀리 식 객체에 대해 정의 된 모든 속성과 방법이 생성자라는 함수에 배치되었습니다. 함수가 호출 될 때만 모 놀리 식 물체를 생성 할 수 있습니다. 그렇지 않으면 직접 생성되지 않습니다. 그런 다음 외부 통화를위한 getInstance 메소드가 포함 된 객체를 반환하십시오. 이 방법을 호출 할 때 먼저 모 놀리 식 물체가 존재하는지 여부를 결정하십시오. 존재하면 직접 반환하십시오. 그렇지 않으면 생성자 함수를 호출하여 모 놀리 식 물체를 구성하고 반환하십시오. 마지막으로, 모 놀리 식 객체의 메소드를 호출하면 myspace.singleton.getinstance (). publicmethod1 ()을 사용해야합니다. 여기서, 우리는이 방법을 호출 할 때만이 모 놀리 식 객체 만 만들 것입니다. 그렇지 않으면 모 놀리 식 객체가 자동으로 생성되지 않으므로 실제로 주문형 로딩 또는 게으른 하중을 구현합니다.