Prototype inheritance, wattisdis

stoke - lunedì 28 Gennaio

Fuori c’è un tempo veramente di merda: fa freddo, piove e c’è un ragazzo che somiglia molto a nex che corre nudo in mezzo alla strada.

E’ in questi momenti che di solito mi faccio un giro nelle varie community; e più leggo discussioni sulla pseudo-OOP di js più mi inalbero come nex davanti al C++.

Il fatto è che non riesco ancora a comprendere perché ci siano sempre più webdeveloper (o probabilmente persone che si appropriano di quel titolo ingiustamente) che non riescono a capire la prototype inheritance di js, infamandola quindi ingiustamente.

Every fuckin’ thing is an object

Yep, even your girlfriend’s vagina

Potrei molto semplicemente dire che qualsiasi tipo di dato presente in js sia un oggetto (e devo dire che sono molto tentato dal farlo), e in teoria sarebbe corretto, ma sono sicuro che nessuno capirebbe che merda significa, e lo scopo dell’articolo andrebbe pian piano a farsi fottere (quasi quanto nex in un qualsivoglia locale gay).

{}

Questo è un oggetto, e poichè voglio trattarvi come bambini idioti (ma in fondo lo siete tutti), aggiungiamo due proprietà: “username” e “isGay”.

var nex = {
  username: "nex",
  isGay: true
};

Se voglio accedere alla proprietà “isGay”, posso farlo attraverso l’operatore “.”

if (nex.isGay)
  console.log("Nothing new");

Oh, ma non è lo stesso operatore che uso per accedere alla lunghezza di una stringa?

console.log("Nex is %d long", "Nex".length)

 Contesti

  Deh

Se non avete capito un cazzo di quello che significa il paragrafo precedente, quittate ora la programmazione.

Se c’è una cosa che mi piace veramente tanto di js sono le funzioni; puoi usarle come merda ti pare

var a = function() {
  console.log("A WHALE");
};

(function asyncRecursion() {
  setInterval(500, asyncRecursion);
})();

nexgay(function() {
  a();
  console.log("JAVA E' FIGO");
});

A seconda di dove si trovano cambia il contesto di esecuzione, e di conseguenza la keyword “this” sarà una reference all’oggetto da cui la funzione viene chiamata

var nex = {
  isGay: true,
  username: "nex",
  print: function() { console.log("%s %s gay", this.username, this.isGay ? "is" : "isn't") } };
};

nex.print();
// -> nex is gay

var lotus = { isGay: false, username: "lotus" };
lotus.print = nex.print;
lotus.toggleGay();
// -> lotus isn't gay

Inutile dire che se la funzione viene chiamata senza essere contenuta in un oggetto, il contesto di esecuzione, e quindi this, saranno l’oggetto globale (e.g. window)

Prototype chain

Puro js bondage

Proverò a spiegare il concetto di prototype chain nel modo più chiaro possibile, ma già so che uscirà fuori una montagna di merda grande quasi quanto quella di nex dopo una cena messicana.


Quando in js si prova ad accedere ad una proprietà all’interno di un qualsiasi dato, questa proprietà viene cercata nell’oggetto corrente, e se esiste una proprietà chiamata “__proto__” che al contempo è una reference ad un altro oggetto, la ricerca verrà effettuata anche nell’oggetto puntato dalla suddetta proprietà.

E non è finita qui; se l’oggetto referenziato ha a sua volta un’altra proprietà  __proto__, la ricerca avverrà anche in quest’altra reference, e così via, fino a quando non si incontra un oggetto che non contiene affatto __proto__ o che lo abbia settato a null.

Scritta così sembra na roba senza senso e che non significa nulla, perciò passiamo al codice, che lì sicuramente me la cavo meglio

var a = {};
var b = { nex: 'gay' };

console.log(a.nex);
// -> undefined

a.__proto__ = b;
console.log(a.nex);
// -> gay

console.log(a.nexgay);
// -> undefined

// Ricordate? E' una reference: aggiungendo proprietà in b, le si aggiunge anche in a.__proto__
b.__proto__ = { nexgay: true };
console.log(a.nexgay);
// -> true

Tirate ad indovinare, dove sono tutte le funzioni delle stringhe?

console.log("nexgay".__proto__.substring)
// -> [Function: substring]

Vogliamo provare a fare le robe pazze?

console.log( ({__proto__: "nexgay".__proto__}).substring )
// -> [Function: substring]

Vabbè, spero si sia capito.

Le classi in js fanno cagare!11!!1

No u

Proviamo a creare una “classe”, ora

function Nex() {
}

Nex.prototype.gay = true;

Nex.prototype.cureGayness = function() { this.gay = false; };

var nex = new Nex;

L’operatore new, molto semplicemente crea un nuovo oggetto, ne setta la proprietà “__proto__” a <funzione>.prototype e calla il “constructor” settandone il contest all’oggetto appena creato.

Addirittura si potrebbe scrivere una funzione che simula ciò che l’operatore “new” fa (cioè, circa, senza argomenti)

function nnew(fn) {
  var i = {__proto__: fn.prototype};
  fn.apply(i);

  return i;
}

Ed è così semplice che mi fa svenire.

Ancora una volta, se vi chiedete com’è possibile che i metodi funzionino, quittate dalla programmazione.

Conclusion

aka jizzing around

Devo essere chiaro, ho scritto quest’articolo solo per avere qualcosa da linkare ogni volta che incontrerò una discussione come quelle di cui parlo all’inizio, invece di spendere duecentomila parole senza far capire nulla a nessuno.

See ya.

Theme made by Koala