[Tyler McGinnis] Inheritance vs Composition

Notatki z lektury

Learning JavaScript Design Patterns A book by Addy Osmani

JavaScript Patterns by Stoyan Stefanov

developer.mozilla.org - Inheritance and the prototype chain

Creational patterns

To jest mało przydatne ale pokazuje, że prototype to zwykly obiekt

function Obj() {}
Obj.prototype = (function() {
  let sharedCounter = 0
  return {
    plus: function() {
      sharedCounter++
    },
    minus: function() {
      sharedCounter--
    },
    state: function() {
      return sharedCounter
    },
  }
})()
const A = new Obj()
const B = new Obj()
A.plus()
A.plus()
B.minus()
console.log(A.state(), B.state()) // 1 1

function prototype

function Obj() {
  this.privateCounter = 0
}
Obj.prototype = {
  plus: function() {
    this.privateCounter++
  },
  minus: function() {
    this.privateCounter--
  },
  state: function() {
    return this.privateCounter
  },
}
const A = new Obj()
const B = new Obj()
A.plus()
B.minus()
console.log(A.state(), B.state()) // 1 -1
console.log(A.privateCounter) // 1

Namespace pattern

to jest proste i naturalne

Object Literals

Znane i lubiane tylko problem z kopiowaniem metod dla każdej instancji

Object.create(Object)

Module

Funkcja zwraca obiekt. Tak samo jak Object Literals z dodatkiem zmiennych prywatnych.

Singleton

Pojedyńczy obiekt, globalny dostęp, wbudowane zarządzanie instancją

Object.getInstance()

To nie jest dobre podejście. Lepiej jeśli inicjalizacją obiektów zajmuje się główny program aplikacji, a przekazywanie obiekty korzystają z jawnie przekazanych zależności, a z Singletonów

Factory