Mechanizm prototype

Mechanizm prototype to jedyny sposób dziedzieczenia w jezyku JS. Każdy obiekt posiada link do innego obiektu, zwanego prototypem obiektu. Obiekt posiada własne atrybuty hasOwnProperty() oraz ma dostęp do atrybutów łańcucha prototype. Prototyp obiektu jest ustawiany poprzez wywołanie konstruktora obiektu.

const obj = new Test ( ) {}

Operator new decyduje o tym, że wywołanie zwykłej funkcji staje się wywołaniem konstruktora. Funkcja jest obiektem, który posiada odwołanie do swojego prototypu ale dodatkowo posiada atrybut prototype, który jest linkowany (referencja) do prototypu nowo powstałego obiektu.

function Test() {
  this.size = 1
}
Test.prototype.color = "white"
const obj = new Test()

console.log(obj.color, obj.size) // white 1
console.log(obj.hasOwnProperty("color")) // false
console.log(obj.hasOwnProperty("size")) // true
const Test = {
  color: "white",
}
const obj = Object.create(Test)
obj.size = 1

console.log(obj.color, obj.size) // white 1
console.log(obj.hasOwnProperty("color")) // false
console.log(obj.hasOwnProperty("size")) // true
console.log(obj.__proto__ === Test) // test

Nowsza składnia Object.create() pozwala zdefiniować prototyp poprzez literał obiektu, a nie za pośrednictwem Func.prototype. Powyżej porównanie składni.

Operator new

Co dokładnie robi wywołanie konstruktora obiektu?

A, co robi Object.create(obj)?

function Test() {
  // var this = {}
  // this.[[prototype]] = Test.prototype
  this.size = 1
  // return this
}
Test.prototype.color = "white"
const obj = new Test()

console.log(obj.color, obj.size) // white 1
console.log(Object.getPrototypeOf(obj)) // Obj { color: 'white' }
Object.create = function(obj) {
  function F() {}
  F.prototype = obj
  return new F()
}