실용적인 자바 스크립트 객체 지향 디자인 패턴의 예


81

애플리케이션의 자바 스크립트에서 어떤 객체 지향 디자인 패턴을 사용하며 그 이유는 무엇입니까?

공식적인 디자인 패턴이 첨부되어 있지 않더라도 코드를 게시 할 수 있습니다.

나는 많은 자바 스크립트를 작성했지만 내가하는 일에 많은 객체 지향 패턴을 적용하지 않았으며 많은 것을 놓치고 있다고 확신합니다.


당신은 아마도 당신이 생각할 수있는 의미에서 고전적인 OOP를 보지 못했을 것입니다. 그러나 아마도 프로토 타입 OOP와 함께 기능을 활용했지만 실제로는 실현하지 못했습니다.
dave

나는 실제로 OOP를 사용할 때를 (때때로) 깨닫습니다. OOP를 훨씬 더 의식적으로 사용하기 시작하고 싶습니다. 더 신중하고
싶기

이 질문은 다른 사람들이 자신의 코드에서 수행하는 작업의 목록을 요청하기 때문에 주제에서 벗어난 것으로이 질문을 종료하는 데 투표합니다.
Almo

답변:


54

다음은 세 가지 인기있는 JavaScript 패턴입니다. 클로저로 인해 쉽게 구현할 수 있습니다 .

다음 사항도 확인해보십시오.

다음은 Diaz가 발표 한 2008 년 Google I / O 강연으로 그의 책에서 몇 가지 주제에 대해 논의합니다.


좋은! 카레는 내가하려는 일반화를 수행하는 더 현명한 방법처럼 보입니다. 이미 간단한 형태의 모듈과 메모를 사용하고 있습니다.하지만이 예제를 연구하여 제가 현재 어떻게하는지 밀어 붙일 필요가 있습니다. 어떤 것을 가장 많이 사용합니까?
ming yeow

@ming : 아마도 모듈 패턴 일 것입니다. 구현하고 이해하기 매우 쉬우 며 네임 스페이스 및 개인 변수 / 메소드를 포함한 몇 가지 멋진 기능이 제공됩니다.
Daniel Vassallo

26

계승

저는 ExtJS 3 기반의 상속에 대한 표기법을 사용하는데 , Java에서 고전적인 상속을 에뮬레이트하는 것과 매우 유사합니다. 기본적으로 다음과 같이 실행됩니다.

// Create an 'Animal' class by extending
// the 'Object' class with our magic method
var Animal = Object.extend(Object, {
    move : function() {alert('moving...');}
});

// Create a 'Dog' class that extends 'Animal'
var Dog = Object.extend(Animal, {
    bark : function() {alert('woof');}
});

// Instantiate Lassie
var lassie = new Dog();

// She can move and bark!
lassie.move();
lassie.bark();

네임 스페이스

또한 Eric Miraglia가 네임 스페이스를 고수하는 데 동의하므로 위의 코드는 창 개체 외부의 자체 컨텍스트 내에서 실행되어야합니다. 이는 코드가 브라우저 창에서 실행되는 여러 동시 프레임 워크 / 라이브러리 중 하나로 실행되도록하려는 경우 중요합니다.

즉, 창 개체에 대한 유일한 방법은 고유 한 네임 스페이스 / 모듈 개체를 사용하는 것입니다.

// Create a namespace / module for your project
window.MyModule = {};

// Commence scope to prevent littering 
// the window object with unwanted variables
(function() {

    var Animal = window.MyModule.Animal = Object.extend(Object, {
         move: function() {alert('moving...');}
    });

    // .. more code

})();

인터페이스

또한 인터페이스와 같은 고급 OOP 구성을 사용하여 애플리케이션 디자인을 향상시킬 수도 있습니다. 이것에 대한 나의 접근 방식Function.prototype다음 줄을 따라 표기법을 얻기 위해를 향상시키는 것 입니다.

var Dog = Object.extend(Animal, {
     bark: function() {
         alert('woof');
     }
     // more methods ..
}).implement(Mammal, Carnivore);

OO 패턴

Java 의미의 '패턴'에 관해서 는 사용자가 버튼을 클릭 할 때 일부 작업을 할당하는 것과 같은 이벤트 기반 기능 에 대해 Singleton 패턴 (캐싱에 적합)과 Observer 패턴 만 사용 했습니다.

관찰자 패턴을 사용하는 예는 다음과 같습니다.

// Instantiate object
var lassie = new Animal('Lassie');

// Register listener
lassie.on('eat', function(food) {
   this.food += food;
});

// Feed lassie by triggering listener
$('#feeding-button').click(function() {
    var food = prompt('How many food units should we give lassie?');
    lassie.trigger('eat', [food]);
    alert('Lassie has already eaten ' + lassie.food + ' units');
});

그리고 그것은 내 OO JS 가방에있는 몇 가지 트릭 일뿐입니다. 유용하기를 바랍니다.

이 길을 가고 싶다면 Douglas Crockfords Javascript : the Good Parts 를 읽는 것이 좋습니다 . 이것에 대한 훌륭한 책입니다.


20

저는 모듈 패턴 의 팬입니다 . 확장 가능하고 비 의존적 (대부분의 경우) 프레임 워크를 구현하는 방법입니다.

예:

프레임 워크 Q는 다음과 같이 정의됩니다.

var Q = {};

기능을 추가하려면 :

Q.test = function(){};

이 두 줄의 코드는 함께 사용되어 모듈 을 형성 합니다 . 모듈이면의 아이디어는 모두 기본 프레임 워크 (이 경우 Q)를 확장하지만 서로 의존하지 않고 (올바르게 설계된 경우) 순서에 관계없이 포함될 수 있다는 것입니다.

모듈에서 프레임 워크 객체가없는 경우 먼저 생성합니다 ( Singleton 패턴 의 예 ).

if (!Q)
    var Q = {};

Q.myFunction = function(){};

이렇게하면 위와 같은 여러 모듈을 별도의 파일에 포함 할 수 있으며 순서에 관계없이 포함 할 수 있습니다. 그들 중 하나는 프레임 워크 개체를 만든 다음 확장합니다. 프레임 워크가 있는지 수동으로 확인할 필요가 없습니다. 그런 다음 모듈 / 함수가 사용자 지정 코드에 있는지 확인하려면 :

if (Q.myFunction)
    Q.myFunction();
else
    // Use a different approach/method

1
이것은 매우 유용 해 보입니다. 코드에서 이것을 어떻게 사용하고 있습니까? 공유해 주셔서 감사합니다!
밍 yeow

공통 기능, UI 및 기타 두 가지 특수 메커니즘을위한 별도의 JavaScript 파일이있는 최근 프로젝트에서 사용했습니다. 모든 파일은 동일한 프레임 워크에 함수를 추가했으며 (위에서 설명한 방법을 사용하여 정의 됨) 위에서했던 것처럼 함수를 호출했습니다.
Chris Laplante

이러한 유형의 기술의 주요 용도 중 하나는 글로벌 네임 스페이스의 오염을 피하는 것입니다. 무엇이 더 오염됩니까? 단일 Q프레임 워크 변수 또는 수십 및 수십 개의 함수 및 변수?
Chris Laplante


4

저는 jquery의 메서드 체인 패턴을 정말 좋아 하여 하나의 객체에서 여러 메서드를 호출 할 수 있습니다. 한 줄의 코드로 여러 작업을 수행하는 것이 정말 쉽습니다.

예:

$('#nav').click(function() {
   $(this).css('color','#f00').fadeOut();
});

맞아-동의했다! 이전에 이러한 방식으로 작동하는 사용자 지정 방법을 개발 한 적이 있습니까?
밍 yeow

3

저는 jQuery 플러그인이 있는 Decorator 패턴 을 정말 좋아합니다 . 필요에 맞게 플러그인을 수정하는 대신 요청을 전달하고 추가 매개 변수와 기능을 추가하는 커스텀 플러그인을 작성하세요.

당신이 항상 주위에 기본 인수 세트를 전달해야하고, 예를 들어, 당신은 비즈니스 로직에 관계가 무엇이든 않는 플러그인을 작성하는 것이 약간-다른 동작을 필요 pre하고 post필요에 따라 필요한 작업과 기본 인수를 전달을 특정 인수가 지정되지 않은 경우.

이것의 주요 이점은 라이브러리를 업데이트 할 수 있고 라이브러리 변경 포팅에 대해 걱정할 필요가 없다는 것입니다. 코드가 깨질 수 있지만 적어도 깨지지 않을 가능성은 있습니다.


이것은 좋은 생각처럼 들립니다. 실제 확장을 수행하는 코드에 대한 실제 예제가 있습니까? 간단한 예라도 모두에게 큰 도움이 될 것입니다.
ming yeow

3

자바 스크립트 세계에서 유용한 패턴 중 하나는 처음에 LINQ에서 인기를 얻었으며 jQuery에서도 사용되는 체인 패턴입니다.

이 패턴을 사용하면 연결 방식으로 클래스의 다른 메서드를 호출 할 수 있습니다.

이 패턴의 주요 구조는 다음과 같습니다.

var Calaculator = function (init) {
    var result = 0;
    this.add = function (x) { result += (init + x); return this; };
    this.sub = function (x) { result += (init - x); return this; };
    this.mul = function (x) { result += (init * x); return this; };
    this.div = function (x) { result += (init / x); return this; };

    this.equals = function (callback) {
        callback(result);
    }

    return this;
};


new Calaculator(0)
    .add(10)
    .mul(2)
    .sub(5)
    .div(3)
    .equals(function (result) {
        console.log(result);
    });

이 패턴의 핵심 아이디어 this는 계산기 기능의 다른 공개 멤버에 대한 액세스를 가능하게하는 키워드입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.