Skip to content
Snippets Groups Projects
Select Git revision
  • move-gl-dropdown
  • improve-table-pagination-spec
  • move-markdown-preview
  • winh-fix-merge-request-spec
  • master default
  • index-namespaces-lower-name
  • winh-single-karma-test
  • 10-3-stable
  • 36782-replace-team-user-role-with-add_role-user-in-specs
  • winh-modal-internal-state
  • tz-ide-file-icons
  • 38869-milestone-select
  • update-autodevops-template
  • jivl-activate-repo-cookie-preferences
  • qa-add-deploy-key
  • docs-move-article-ldap
  • 40780-choose-file
  • 22643-manual-job-page
  • refactor-cluster-show-page-conservative
  • dm-sidekiq-versioning
  • v10.4.0.pre
  • v10.3.0
  • v10.3.0-rc5
  • v10.3.0-rc4
  • v10.3.0-rc3
  • v10.3.0-rc2
  • v10.2.5
  • v10.3.0-rc1
  • v10.0.7
  • v10.1.5
  • v10.2.4
  • v10.2.3
  • v10.2.2
  • v10.2.1
  • v10.3.0.pre
  • v10.2.0
  • v10.2.0-rc4
  • v10.2.0-rc3
  • v10.1.4
  • v10.2.0-rc2
40 results

design_patterns.md

Blame
  • Forked from GitLab.org / GitLab FOSS
    2629 commits behind the upstream repository.

    Design Patterns

    Singletons

    When exactly one object is needed for a given task, prefer to define it as a class rather than as an object literal. Prefer also to explicitly restrict instantiation, unless flexibility is important (e.g. for testing).

    // bad
    
    const MyThing = {
      prop1: 'hello',
      method1: () => {}
    };
    
    export default MyThing;
    
    // good
    
    class MyThing {
      constructor() {
        this.prop1 = 'hello';
      }
      method1() {}
    }
    
    export default new MyThing();
    
    // best
    
    export default class MyThing {
      constructor() {
        if (!this.prototype.singleton) {
          this.init();
          this.prototype.singleton = this;
        }
        return this.prototype.singleton;
      }
    
      init() {
        this.prop1 = 'hello';
      }
    
      method1() {}
    }
    

    Manipulating the DOM in a JS Class

    When writing a class that needs to manipulate the DOM guarantee a container option is provided. This is useful when we need that class to be instantiated more than once in the same page.

    Bad:

    class Foo {
      constructor() {
        document.querySelector('.bar');
      }
    }
    new Foo();

    Good:

    class Foo {
      constructor(opts) {
        document.querySelector(`${opts.container} .bar`);
      }
    }
    
    new Foo({ container: '.my-element' });

    You can find an example of the above in this class;