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.
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()
}