Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto:...

213

Transcript of Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto:...

Page 1: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan
Page 2: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Javascript para Profesionales

made with love by Redradix (www.redradix.com)

Page 3: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Fundamentos

Page 4: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Objetos

l Conjunto de propiedades propias + heredadas de otro objeto (prototipos)

l ¡Qué no cunda el pánico!

Page 5: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Objetos

l Dinámicos

l Set de strings

var obj = {};obj.nuevaPropiedad = 1;delete obj.nuevaPropiedad;

var strset = { hola: true, adios: true};"hola" in strset;

Page 6: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Objetos

l Referencias

l Todo son objetos excepto: strings, números, booleans, null o undefined

l Strings, números y booleans se comportan como objetos inmutables

var p1 = {x: 1}, p2 = p1;

p1 === p2; // truep1.x = 5;p2.x; // 5

Page 7: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Objetos

l Ciudadanos de primer orden

l Contener valor primitivo u otros objetos. Incluyendo funciones.

(function (obj) { return {b: 2};})({a: 1});

var obj = { f: function() { console.log("hola"); }};obj.f();

Page 8: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Objetos

l Literales

- clase: Object

- sencillos y ligeros

l Construidos

- clase: prototype

- constructor

{ un: "objeto", literal: true};

new NombreDeUnaFuncion();

Page 9: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clases

l Pueden entenderse como:− Tipo (jerárquico) de datos

− Aquí no

− Categoría de objetos con la misma estructura

− Al grano: objetos con el mismo prototipo.

Page 10: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clases

Si esto es un “punto”

Y esto es otro “punto”

¿Qué es esto?

¿Y esto?

var point = {x: 0, y: 0};

var point2 = {x: 5, y: 5};

var what = {x: 10, y: 10};

var isit = {x: -10, y: -20};

Page 11: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

• Teniendo:

• ¿Que significa esto?

var obj = { nombre: "Pepito", saludo: function () { return "Hola, Mundo!"; }};

obj.nombre;

Page 12: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

• Teniendo:

• ¿Y esto?

var obj = { nombre: "Pepito", saludo: function () { return "Hola, Mundo!"; }};

obj.saludo;

Page 13: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

• Teniendo:

• ¿Y esto otro? (¡cuidado!)

var obj = { nombre: "Pepito", saludo: function () { return "Hola, Mundo!"; }};

obj[“saludo”]();

Page 14: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

• Teniendo:

• ¿Es lo mismo?

var obj = { nombre: "Pepito", saludo: function () { return "Hola, Mundo!"; }};

var fn = obj["saludo"];fn();

Page 15: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

• Teniendo:

• ¡NO es no mismo!

var obj = { nombre: "Pepito", saludo: function () { return "Hola, Mundo!"; }};

var fn = obj["saludo"];fn();

Page 16: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

• Una función se puede ejecutar de 4 maneras:

- Invocando directamente la función

- Enviando un mensaje a un objeto (método)

- Como constructor

- Indirectamente, a través de call(...) y apply(...)

(function() { alert("Hey!"); })();

objeto.metodo();

new MiConstructor();

fn.call({}, "param");

Page 17: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

- Invocando directamente la función

- Enviando un mensaje a un objeto (método)

(function() { alert("Hey!"); })();

objeto.metodo();

Page 18: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

Un mensaje se envía a un receptor

var obj = {};obj.toString(); // [object Object]

"hola don Pepito".toUpperCase();

Page 19: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

Un mensaje se envía a un receptor

var obj = {};obj.toString(); // [object Object]

"hola don Pepito".toUpperCase();

Page 20: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

La sintaxis es engañosa

var obj = { coleccion: ["uno", "dos", "tres"], metodo: function() { return "Hola, Mundo!"; }};

obj.coleccion[1]; obj.metodo();vs.

Page 21: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

obj.metodo();var fn = obj.metodo;fn();

Page 22: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

obj.metodo();var fn = obj.metodo;fn();

- Accede a la propiedad “metodo” de obj

- Supongo que es una función y la invoco

Page 23: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

obj.metodo();var fn = obj.metodo;fn();

- Accede a la propiedad “metodo” de obj

- Supongo que es una función y la invoco

- Envía el mensaje “metodo” a obj

- Si existe, obj se encarga de ejecutar la función

Page 24: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

obj.metodo();var fn = obj.metodo;fn();

- Accede a la propiedad “metodo” de obj

- Supongo que es una función y la invoco

- NO HAY RECEPTOR

- Envía el mensaje “metodo” a obj

- Si existe, obj se encarga de ejecutar la función

- obj ES EL RECEPTOR

Page 25: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

Un error típico:

$("#elemento").click(objeto.clickHandler);

Page 26: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

Un error típico:

• Lo que se intenta decir:

- “Al hacer click sobre #elemento, envía el mensaje clickHandler a objeto”

$("#elemento").click(objeto.clickHandler);

Page 27: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mensajes

Un error típico:

• Lo que se intenta decir:

- “Al hacer click sobre #elemento, envía el mensaje clickHandler a objeto”

• Lo que se dice en realidad:

- “Accede al valor de la propiedad clickHandler de objeto y ejecútalo al hacer click sobre #elemento”

$("#elemento").click(objeto.clickHandler);

Page 28: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: ...

¿Por qué tanto lío con el receptor del mensaje?

Page 29: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

¿Por qué tanto lío con el receptor del mensaje?

- ¡El receptor es this!

- La metáfora mensaje/receptor aclara su (escurridizo) significado

Page 30: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

this = “el receptor de este mensaje”

var nombre = "Sonia";

var obj = { nombre: "Pepito", saludo: function() { alert("hola " + this.nombre); }}

obj.saludo();

Page 31: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

this• Su significado es dinámico

• Se decide en el momento (y según la manera) de ejecutar la función

• Se suele llamar “el contexto de la función”

• Cuando no hay receptor, apunta al objeto global

Page 32: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Cuando no hay receptor, es el objeto global

var nombre = "Sonia"

var obj = { nombre: "Pepito", saludo: function() { alert("hola " + this.nombre) }}

var fn = obj["saludo"];fn();

Page 33: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Su valor es dinámico

var obj = { nombre: "Pepito", saludo: function() { alert("hola " + this.nombre); }};

var maria = { nombre: "María"};

maria.saludo = obj.saludo;maria.saludo();

Page 34: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Semánticamente, es como un parámetro oculto

que el receptor se encargara de proveer

function ([this]) { alert("hola " + this.nombre);}

obj.saludo(); => saludo([obj]);

Page 35: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Semánticamente, es como un parámetro oculto

var nombre = "Sonia";

var obj = { nombre: "Pepito", saludo: function() { var saludo_fn = function() { alert("hola " + this.nombre); }; saludo_fn(); }};

obj.saludo();

Page 36: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Semánticamente, es como un parámetro oculto

var nombre = "Sonia";

var obj = { nombre: "Pepito", saludo: function([this]) { var saludo_fn = function([this]) { alert("hola " + this.nombre); }; saludo_fn([objeto global]); }};

obj.saludo([obj]);

Page 37: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Semánticamente, es como un parámetro oculto

var nombre = "Sonia";

var obj = { nombre: "Pepito", saludo: function([this]) { var saludo_fn = function([this]) { alert("hola " + this.nombre); }; saludo_fn([objeto global]); }};

obj.saludo([obj]);

Page 38: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Es decir:

• Cada función tiene su propio this

• Una función anidada en otra NO comparte el receptor

• El valor de this depende de la invocación, NO de la definición (no se clausura)

Page 39: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Otro error común:

var obj = { clicks: 0, init: function() { $("#element").click(function() { this.clicks += 1; }); }};

obj.init();

Page 40: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Otro error común:

var obj = { clicks: 0, init: function([this]) { $("#element").click(function([this]) { this.clicks += 1; }); }};

obj.init([obj]);

Page 41: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

Una posible solución (aunque no la mejor):

var obj = { clicks: 0, init: function() { var that = this; $("#element").click(function() { that.clicks += 1; }); }};

obj.init();

Page 42: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Repaso: Mensajes

• Una función se puede ejecutar de 4 maneras:

- Invocando directamente la función

- Enviando un mensaje a un objeto (método)

- Como constructor

- Indirectamente, a través de call(...) y apply(...)

(function() { alert("Hey!"); })();

objeto.metodo();

new MiConstructor();

fn.call({}, "param");

Page 43: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Repaso: Mensajes

Una función se puede ejecutar de 4 maneras:

Invocando directamente la función

Enviando un mensaje a un objeto (método)

Como constructor

- Indirectamente, a través de call(...) y apply(...)

fn.call({}, "param");

Page 44: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

• Las funciones son objetos

• Se pueden manipular como cualquier otro objeto

- Asignar valores a propiedades

- Pasar como parámetros a otras funciones

- Ser el valor de retorno

- Guardarse en variables u otros objetos

• Tienen métodosvar fn = function() { alert("Hey!"); };

fn.toString();

Page 45: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

• Dos métodos permiten manipular el receptor (contexto):

- fn.call(context [, arg1 [, arg2 [...]]])

- fn.apply(context, arglist)

var a = [1,2,3];Array.prototype.slice.call(a, 1, 2); // [2]

var a = [1,2,3];Array.prototype.slice.apply(a, [1, 2]); // [2]

Page 46: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El receptor: this

var nombre = "Objeto Global";

function saluda() { alert("Hola! Soy " + this.nombre);}

var alicia = { nombre: "Alicia"};

saluda();

saluda.call(alicia);

Page 47: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

arguments

• El otro parámetro oculto

• Contiene una lista de todos los argumentos

• NO es un Array

function echoArgs() { alert(arguments); // [object Arguments]}

echoArgs(1, 2, 3, 4);

Page 48: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

arguments

• Se comporta (más o menos) como Array...

• ...pero NO del todo

function echoArgs() { alert(arguments[0]); // 1}

echoArgs(1, 2, 3, 4);

function echoArgs() { return arguments.slice(0, 1); // Error!}

echoArgs(1, 2, 3, 4);

Page 49: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

arguments

• Un truco:

function echoArgs() { var slice = Array.prototype.slice; return slice.call(arguments, 0, 1);}

echoArgs(1, 2, 3, 4); // [1]

Page 50: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

arguments

¡Cuidado, se comporta como parámetro oculto!

function exterior() { var interior = function() { alert(arguments.length); }; interior();}

exterior("a", "b", "c");

Page 51: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

¿Qué hace esta función?

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

Page 52: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

var algo = misterio();

typeof algo; // ???

Page 53: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

var algo = misterio();

algo(); // ???

Page 54: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

var algo = misterio({}, function() { return this;});

typeof algo(); // ???

Page 55: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

var obj = {};

var algo = misterio(obj, function() { return this;});

obj === algo(); // ???

Page 56: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

var obj = {};

var algo = misterio({}, function() { return this;});

obj === algo(); // ???

Page 57: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

var obj = { nombre: "Bárbara"};

var algo = misterio(obj, function() { return this.nombre;});

algo(); /// ???

Page 58: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

var obj = { nombre: "Bárbara"};

var algo = misterio(obj, function (saludo) { return saludo + " " + this.nombre;});

algo("Hola, "); /// ???

Page 59: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

function misterio(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

var barbara = { nombre: "Bárbara" };var carlos = { nombre: "Carlos" };

var algo = misterio(barbara, function (saludo) { return saludo + " " + this.nombre;});

algo.call(carlos, "Hola, "); /// ???

Page 60: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

• bind: fija una función a un contexto

function bind(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

Page 61: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

Volviendo al problema:

var obj = { clicks: 0, init: function() { $("#element").click(function() {

// MAL this.clicks += 1; }); }};

obj.init();

Page 62: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

Apaño:

var obj = { clicks: 0, init: function() { var that = this; $("#element").click(function() { that.clicks += 1; }); }};

obj.init();

Page 63: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

¿Qué pasa si el callback es un método?

var obj = { clicks: 0, incClicks: function() { this.clicks += 1; }, init: function() { $("#element").click( // ??? ); }};

obj.init();

Page 64: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

Apaño cada vez más feo:

var obj = { clicks: 0, incClicks: function() { this.clicks += 1; }, init: function() { var that = this; $("#element").click(function() { that.incClicks(); }); }};

Page 65: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

• bind al rescate

var obj = { clicks: 0, incClicks: function() { this.clicks += 1; }, init: function() { $("#element").click( bind(this, this.incClicks) ); }};

Page 66: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

¿Qué hace esta otra función?

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

Page 67: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

typeof enigma(); // ???

Page 68: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

var cosa = enigma();typeof cosa(); // ???

Page 69: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

var cosa = enigma(function() { return "Hola!";});

cosa(); // ???

Page 70: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

function saluda(nombre) { return "Hola, " + nombre + "!";}

var cosa = enigma(saluda);

cosa("Mundo"); // ???

Page 71: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

function saluda(nombre) { return "Hola, " + nombre + "!";}

var cosa = enigma(saluda, "Mundo");

cosa(); // ???

Page 72: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

function saluda(saludo, nombre) { return saludo + ", " + nombre + "!";}

var cosa = enigma(saluda, "Hola", "Mundo");

cosa(); // ???

Page 73: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

function saluda(saludo, nombre) { return saludo + ", " + nombre + "!";}

var cosa = enigma(saluda, "Hola");

cosa("Mundo"); // ???cosa("Don Pepito"); // ???

Page 74: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

intermedio: this y arguments

function enigma(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

var dario = {nombre: "Darío"};var elena = {nombre: "Elena"};

function saluda(saludo) { return saludo + ", " + this.nombre + "!";}

var cosa = enigma(saluda, "Qué pasa");

cosa.call(dario); // ???cosa.call(elena); // ???

Page 75: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: this y arguments

• curry: aplicación parcial de una función

function curry(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

Page 76: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: rizar el rizo

var unObj = { nombre: "Manuel", edad: 32};

function getNombre() { return this.nombre; }function setNombre(nombre) { this.nombre = nombre; }function getEdad() { return this.edad; }function setEdad(edad) { this.edad = edad; }

var bindToUnObj = curry(bind, unObj), getUnObjNombre = bindToUnObj(getNombre), setUnObjNombre = bindToUnObj(setNombre);

setUnObjNombre("Pepito");getUnObjNombre(); // ???

Page 77: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: rizar el rizo

function getter(prop) { return this[prop]; }function setter(prop, value) { this[prop] = value; }

var manuel = { nombre: "Manuel", edad: 32};

var edadDeManuel = bind(manuel, curry(getter, "edad"));edadDeManuel(); // ???

Page 78: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

Page 79: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

• ¿Por qué tan mala fama?

• ¡Es un mecanismo muy sencillo!

• Distinto a otros lenguajes

Page 80: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

Un objeto obj:

qué pasa si hacemos:

var obj = {uno: 1, dos: 2};

obj.uno; // 1

Page 81: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

var obj = {uno: 1, dos: 2};

obj.uno; // 1

uno 1

dos 2

uno 1

dos 2

obj

obj

Page 82: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

Si hacemos:

var obj = {uno: 1, dos: 2};

obj.tres; // undefined

uno 1

dos 2

obj

objuno 1dos 2

Not found! undefined

Page 83: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

¿De dónde sale?

var obj = {uno: 1, dos: 2};

obj.toString(); // '[object Object]'

uno 1

dos 2

obj

objuno 1dos 2

Not found! undefined

¿?

Page 84: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

obj.toString(); // '[object Object]'

objuno 1

dos 2

prototype Object

toString functionvalueOf function

...Not found! undefined

Object

Page 85: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

Teniendo:

auno 1dos 2

prototype b

toString functionvalueOf function

...Not found! undefine

d

Objectbtres 3

cuatro 4prototype Object

Page 86: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

auno 1dos 2

prototype b

toString functionvalueOf function

...Not found! undefine

d

Objectbtres 3

cuatro 4prototype Object

a.uno; // 1

Page 87: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

auno 1dos 2

prototype b

toString functionvalueOf function

...Not found! undefine

d

Objectbtres 3

cuatro 4prototype Object

a.cuatro; // 4

Page 88: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

auno 1dos 2

prototype b

toString functionvalueOf function

...Not found! undefine

d

Objectbtres 3

cuatro 4prototype Object

a.toString; // [object Object]

Page 89: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

auno 1dos 2

prototype b

toString functionvalueOf function

...Not found! undefine

d

Objectbtres 3

cuatro 4prototype Object

a.noExiste; // undefined

Page 90: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

Pero... ¿Cómo establezco el prototipo de un objeto?

- No se puede hacer directamente

- No se puede modificar el prototipo de objetos literales

- Solo objetos generados (con new)

- Constructores!

Page 91: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Repaso: Mensajes

• Una función se puede ejecutar de 4 maneras:

- Invocando directamente la función

- Enviando un mensaje a un objeto (método)

- Como constructor

- Indirectamente, a través de call(...) y apply(...)

(function() { alert("Hey!"); })();

objeto.metodo();

new MiConstructor();

fn.call({}, "param");

Page 92: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Repaso: Mensajes

Una función se puede ejecutar de 4 maneras:

Invocando directamente la función

Enviando un mensaje a un objeto (método)

- Como constructor

new MiConstructor();

Page 93: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

• Funciones

• Invocación precedida por new

• Su contexto es un objeto recién generado

• return implícito

• La única manera de manipular prototipos

Page 94: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

function Constructor(param) { // this tiene otro significado! this.propiedad = "una propiedad!"; this.cena = param;}

var instancia = new Constructor("Pollo asado");instancia.propiedad; // una propiedad!instancia.cena; // "Pollo asado"

Page 95: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

function Constructor(param) { // this tiene otro significado! this.propiedad = "una propiedad!"; this.cena = param;}

var instancia = new Constructor("Pollo asado");instancia.propiedad; // una propiedad!instancia.cena; // "Pollo asado"

Page 96: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

3 pasos:

1. Crear un nuevo objeto

2. Prototipo del objeto = propiedadad prototype del constructor

3. El nuevo objeto es el contexto del constructor

Page 97: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

var b = { uno: 1, dos: 2};

function A() { this.tres = 3; this.cuatro = 4;}

A.prototype = b;

var instancia = new A();instancia.tres; // 3instancia.uno; // 1

Page 98: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

var b = { uno: 1, dos: 2};

function A() { this.tres = 3; this.cuatro = 4;}

A.prototype = b;

var instancia = new A();instancia.tres; // 3instancia.uno; // 1

instanciauno 1dos 2

proto b

btres 3

cuatro 4proto Object

Page 99: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

.hasOwnProperty(name)• Distinguir las propiedades heredadas de las propias

• true solo si la propiedad es del objeto

instancia.hasOwnProperty("tres"); // trueinstancia.hasOwnProperty("uno"); // false

Page 100: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

¿Qué pasa aquí?

var comun = { empresa: "ACME" };

function Empleado(nombre) { this.nombre = nombre;}Empleado.prototype = comun;

var pepe = new Empleado("Pepe");

pepe.nombre; // "Pepe"pepe.empresa; // ???

Page 101: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

¿Qué pasa aquí?

var comun = { empresa: "ACME" };

function Empleado(nombre) { this.nombre = nombre;}Empleado.prototype = comun;

var pepe = new Empleado("Pepe");

comun.empresa = "Googlezon";var antonio = new Empleado("Antonio");

antonio.empresa; // ???

Page 102: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

¿Qué pasa aquí?

var comun = { empresa: "ACME" };

function Empleado(nombre) { this.nombre = nombre;}Empleado.prototype = comun;

var pepe = new Empleado("Pepe");

comun.empresa = "Googlezon";var antonio = new Empleado("Antonio");

pepe.empresa; // ???

Page 103: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

pepenombre “Pepe”

proto comun

comunempresa “ACME”

proto Object

var pepe = new Empleado("Pepe");

Page 104: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

pepenombre “Pepe”

proto comun

comunempresa “Googlezone”

proto Object

comun.empresa = "Googlezon";

Page 105: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

pepenombre “Pepe”

proto comun

comunempresa “Googlezone”

proto Object

antonionombre “Antonio”

proto comun

var antonio = new Empleado("Antonio");

Page 106: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Constructores

pepenombre “Pepe”

proto comun

comunempresa “Googlezone”

proto Object

antonionombre “Antonio”

proto comun

pepe.empresa;

Page 107: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Prototipos

Es decir:

• Las propiedades de los prototipos se comparten!

• Se resuelven dinámicamente

• Modificar un prototipo afecta a todas las instancias anteriores (y futuras)!

Page 108: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

¿Cómo hacer que C herede de B que hereda de A?

Page 109: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

¿Cómo hacer que C herede de B que hereda de A?

Cuno 1

proto B

tres 3

proto Object

ABdos 2

proto A

var instancia = new C();instancia.tres; // 3

Page 110: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

function C() { this.uno = 1;}

var instancia = new C();instancia.tres;

Page 111: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

var B = {dos: 2};

function C() { this.uno = 1;}

C.prototype = B;

var instancia = new C();instancia.tres;

Page 112: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

var A = {tres: 3};

function B() { this.dos = 2;}B.prototype = A;

function C() { this.uno = 1;}C.prototype = B;

var instancia = new C();instancia.tres;

Page 113: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

var A = {tres: 3};

function B() { this.dos = 2;}B.prototype = A;

function C() { this.uno = 1;}C.prototype = B;

var instancia = new C();instancia.dos; // !!!

Page 114: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

var A = {tres: 3};

function B() { this.dos = 2;}B.prototype = A;

function C() { this.uno = 1;}C.prototype = B;

typeof C.prototype; // ???C.prototype.dos; // ???

Page 115: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

var A = {tres: 3};

function B() { this.dos = 2;}B.prototype = A;

function C() { this.uno = 1;}C.prototype = new B();

var instancia = new C();instancia.tres;

Page 116: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: constructores

function A() { this.tres = 3;}

function B() { this.dos = 2;}B.prototype = new A();

function C() { this.uno = 1;}C.prototype = new B();

var instancia = new C();instancia.tres;

Page 117: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Cadena de prototipos

La herencia en varios niveles necesita:

• Encadenar prototipos

• El prototipo del “sub constructor” ha de ser siempre new Padre()

• Es la única manera de mantener el “padre del padre” en la cadena!

Page 118: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mecanismos de herencia

Page 119: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Mecanismos de herencia

• Herencia clásica

• Herencia de prototipos

• Mixins (módulos)

• Extra: herencia funcional

Page 120: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

¿Qué significa?

• Clases!

• El tipo de herencia más común en otros lenguajes

• Encapsulado y visibilidad

Page 121: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

Vamos a empezar por un constructor:

function MiClase() { // ???}

var instancia = new MiClase();

Page 122: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

Las propiedades (públicas)

function MiClase() { this.unaPropiedad = "valor"; this.otraPropiedad = "otro valor";}

var instancia = new MiClase();

Page 123: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

¿Métodos?

Page 124: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

¿Métodos?function MiClase() { this.unaPropiedad = "valor"; this.otraPropiedad = "otro valor"; this.unMetodo = function() { alert(this.unaPropiedad); }; this.otroMetodo = function() { alert(this.otraPropiedad); };}

var instancia = new MiClase();instancia.otroMetodo();

Page 125: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

Mejor así:function MiClase() { this.unaPropiedad = "valor"; this.otraPropiedad = "otro valor";}

MiClase.prototype.unMetodo = function() { alert(this.unaPropiedad);};

MiClase.prototype.otroMetodo = function() { alert(this.otraPropiedad);};

var instancia = new MiClase();instancia.otroMetodo();

Page 126: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

Solo falta... function Superclase() { /* ... */ }

function MiClase() { this.unaPropiedad = "valor"; this.otraPropiedad = "otro valor";}MiClase.prototype = new Superclase();

MiClase.prototype.unMetodo = function() { alert(this.unaPropiedad);};

MiClase.prototype.otroMetodo = function() { alert(this.otraPropiedad);};

Page 127: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

¿Cómo se pueden crear métodos “de clase”?

MiClase.metodoEstatico("hola!");

Page 128: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica

¿Cómo se pueden crear métodos “de clase”?

¡Los constructores son objetos!

MiClase.metodoEstatico("hola!");

MiClase.metodoEstatico = function(cadena) { console.log("metodoEstatico:", cadena);}

Page 129: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica: Cuidado!

Este esquema tiene varios problemas:

Page 130: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica: Cuidado!

Este esquema tiene varios problemas:

• ¡No es fácil invocar al super constructor!

Page 131: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica: Cuidado!

function Animal(especie) { this.especie = especie;}

Animal.prototype.getEspecie = function() { return this.especie;}

function Perro(raza) { this.raza = raza;}Perro.prototype = new Animal();

Perro.prototype.describir = function() { return this.getEspecie() + ", de raza " + this.raza;}

Page 132: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

function Animal(especie) { this.especie = especie;}

Animal.prototype.getEspecie = function() { return this.especie;}

function Perro(raza) { // ??? this.raza = raza;}Perro.prototype = new Animal();

Perro.prototype.describir = function() { return this.getEspecie() + ", de raza " + this.raza;}

Herencia clásica: Cuidado!

Page 133: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

function Animal(especie) { this.especie = especie;}

Animal.prototype.getEspecie = function() { return this.especie;}

function Perro(raza) { Animal("perro"); this.raza = raza;}Perro.prototype = new Animal();

Perro.prototype.describir = function() { return this.getEspecie() + ", de raza " + this.raza;}

Herencia clásica: Cuidado!

Page 134: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

function Animal(especie) { this.especie = especie;}

Animal.prototype.getEspecie = function() { return this.especie;}

function Perro(raza) { Animal("perro"); this.raza = raza;}Perro.prototype = new Animal();

Perro.prototype.describir = function() { return this.getEspecie() + ", de raza " + this.raza;}

Herencia clásica: Cuidado!

crea glob. especie!

Page 135: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

function Animal(especie) { this.especie = especie;}

Animal.prototype.getEspecie = function() { return this.especie;}

function Perro(raza) { this = new Animal("perro"); this.raza = raza;}Perro.prototype = new Animal();

Perro.prototype.describir = function() { return this.getEspecie() + ", de raza " + this.raza;}

Herencia clásica: Cuidado!

Page 136: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

function Animal(especie) { this.especie = especie;}

Animal.prototype.getEspecie = function() { return this.especie;}

function Perro(raza) { this = new Animal("perro"); this.raza = raza;}Perro.prototype = new Animal();

Perro.prototype.describir = function() { return this.getEspecie() + ", de raza " + this.raza;}

Herencia clásica: Cuidado!

ERROR!

Page 137: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

function Animal(especie) { this.especie = especie;}

Animal.prototype.getEspecie = function() { return this.especie;}

function Perro(raza) { Animal.call(this, "perro"); this.raza = raza;}Perro.prototype = new Animal();

Perro.prototype.describir = function() { return this.getEspecie() + ", de raza " + this.raza;}

Herencia clásica: Cuidado!

Page 138: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica: Cuidado!

Este esquema tiene varios problemas:

• ¡No es fácil invocar al super constructor!

• No es fácil encapsular

Page 139: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica: Cuidado!

function MiClase() { this.propPublica = "pública!";}

MiClase.prototype.metPublico = function() { return "público!";}

var instancia = new MiClase();instancia.propPublica; // "pública!"instancia.metPublico();

Page 140: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica: Cuidado!

Este esquema tiene varios problemas:

• ¡No es fácil invocar al super constructor!

• No es fácil encapsular...

• ¡Se crea una instancia solo para mantener la cadena de prototipos!

Page 141: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica: Cuidado!

function Superclase() { operacionMuyCostosa(); alert(“Oh, no!”);}

function MiClase() { // ...}MiClase.prototype = new Superclase();

Page 142: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica?

¿Qué se puede hacer?

Page 143: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica?

Hay dos enfoques:

Page 144: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica?

Hay dos enfoques:

• El simple

Page 145: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El “simple”

“Hagamos una funcioncita!”

function inherits(subClass, superClass) { var F = function() {}; F.prototype = superClass.prototype; subClass.prototype = new F(); subClass.prototype.constructor = subClass; // extra subClass.prototype.superclass = superClass;}

Page 146: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El “simple”

function Animal() { }Animal.prototype.mover = function() { console.log("El animal se mueve...");}; Animal.prototype.comer = function() { console.log("¡Ñam!");};

function Perro(raza) { this.superclass.call(this);}inherits(Perro, Animal);

Perro.prototype.comer = function() { console.log("El perro va a por su plato..."); this.superclass.prototype.comer.call(this);};

var p = new Perro("terrier");p.mover();p.comer();p instanceof Perro;

Page 147: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El “simple”

function Animal() { }Animal.prototype.mover = function() { console.log("El animal se mueve...");}; Animal.prototype.comer = function() { console.log("¡Ñam!");};

function Perro(raza) { this.superclass.call(this);}inherits(Perro, Animal);

Perro.prototype.comer = function() { console.log("El perro va a por su plato..."); this.superclass.prototype.comer.call(this);};

var p = new Perro("terrier");p.mover();p.comer();p instanceof Perro;

OMG!

Page 148: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El “simple”

• Ventajas

- Muy simple de implementar

- Muy ligero

- No añade demasiado ruido

• Inconvenientes

- No soluciona mucho...

- No se “heredan” los métodos/propiedades de clase

- Sigue sin ser cómodo de usar

Page 149: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El “simple”

Caso práctico: CoffeeScript

var __hasProp = {}.hasOwnProperty, __extends = function (child, parent) { for (var key in parent) {

if (__hasProp.call(parent, key)) child[key] = parent[key];

} function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

Page 150: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El “simple”

Caso práctico: CoffeeScript

var __hasProp = {}.hasOwnProperty, __extends = function (child, parent) { for (var key in parent) {

if (__hasProp.call(parent, key)) child[key] = parent[key];

} function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; };

Page 151: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El “simple”

var MiClase = (function(_super) {

__extends(MiClase, _super);

function MiClase() { MiClase.__super__.constructor.apply(this, arguments); this.miPropiedad = 1; }

MiClase.prototype.miMetodo = function() { return MiClase.__super__.miMetodo.call(this, "hola"); };

return MiClase;

})(Superclase);

Page 152: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia clásica?

Hay dos enfoques:

• El simple

• El cómodo

Page 153: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El cómodo

Más complejo, pero merece la pena

var Persona = Class.extend({ init: function(nombre) { console.log("Bienvenido,", nombre); }});

var Ninja = Persona.extend({ init: function(){ this._super("ninja"); } esgrimirEspada: function(){ console.log("En guardia!"); }});

Page 154: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El cómodo

Más complejo, pero merece la pena

var Persona = Class.extend({ init: function(nombre) { console.log("Bienvenido,", nombre); }});

var Ninja = Persona.extend({ init: function(){ this._super("ninja"); } esgrimirEspada: function(){ console.log("En guardia!"); }});

Page 155: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: klass.js

¡Rellena los huecos!

var Class = function(){};

Class.extend = function(prop) { var _super = this.prototype;

// ...

return Klass;};

Page 156: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: klass.js

Está muy bien pero...

• No hay métodos de clase (y no se heredan!)

• Todo sigue siendo público

• ¡Es solo una primera versión!

Page 157: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

El cómodo

¿Cuándo usar este método?

• ¡Siempre que sea posible!

Contras:

• La implementación es más compleja...

• Hay que incluir la librería externa

• No es el enfoque “tradicional”

Page 158: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

Vamos a cambiar de marcha...

Page 159: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

Vamos a cambiar de marcha...

¡Ahora, sin clases!

Page 160: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

Vamos a cambiar de marcha...

¡Ahora, sin clases!

¿¿Cómo puede haber POO sin clases??

Page 161: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

Herencia clásica: categorías

-Definir “Persona”

-crear instancias de persona según la definición

-Para hacer más concreto, ¡redefine!

Page 162: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

Herencia clásica: categorías

-Definir “Persona”

-crear instancias de persona según la definición

-Para hacer más concreto, ¡redefine!

Herencia de prototipos: ejemplos

-“Como ese de ahí, pero más alto”

-Cualquier objeto concreto puede servir de ejemplo

-Para hacer más concreto, ¡cambia lo que quieras!

Page 163: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

var benito = { nombre: "Benito", edad: 36, profesión: "jardinero", saludar: function() { alert("Buen día!"); }, envejecer: function() { this.edad += 1; }};

Page 164: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

var benito = { nombre: "Benito", edad: 36, profesión: "jardinero", saludar: function() { alert("Buen día!"); }, envejecer: function() { this.edad += 1; }};

var gonzalo = clone(benito);gonzalo.nombre = "Gonzalo";gonzalo.profesion = "carpintero";gonzalo.saludar(); // Buen día!

Page 165: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

var benito = { nombre: "Benito", edad: 36, profesión: "jardinero", saludar: function() { alert("Buen día!"); }, envejecer: function() { this.edad += 1; }};

var gonzalo = clone(benito);gonzalo.nombre = "Gonzalo";gonzalo.profesion = "carpintero";gonzalo.saludar(); // Buen día!

Page 166: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

También se puede generalizarvar Animal = { vivo: true, comer: function() { console.log("Ñam, ñam"); }};

var Perro = clone(Animal);Perro.especie = "perro";

var Dogo = clone(Perro);Dogo.raza = "dogo";

var toby = clone(Dogo);toby.nombre = "Toby";

Page 167: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

¡Así de simple!

function clone(obj) { function F(){} F.prototype = obj; return new F();}

Page 168: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

Herencia clásica vs. de prototipos

• Clásica

✓ MUCHO más extendida y bien comprendida

✓ Mayor catálogo de mecanismos de abstracción

• Prototipos

✓ Uso mucho más eficiente de la memoria

✓ La “auténtica” herencia en JS

✓ Muy simple

Page 169: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

Peeero...

• Clásica

๏ Solo se puede emular. Necesario entender los prototipos.

๏ A contrapelo

• Prototipos

๏ Bastante limitada

๏ Lenta con cadenas de prototipos largas!

Page 170: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

¿Cuál uso?

Page 171: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Herencia de prototipos

¿Cuál uso?

¡Las dos!

Page 172: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

¿Qué significa?

objeto.propiedad;

Page 173: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

¿Qué significa?

“Accede a la propiedad propiedad del objeto objeto”

objeto.propiedad;

Page 174: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

¿Qué significa?

“Accede a la propiedad propiedad del objeto objeto. Si no la encuentras, sigue buscando por la cadena de prototipos.”

objeto.propiedad;

Page 175: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

¿Qué significa?

objeto.propiedad = 1;

Page 176: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

¿Qué significa?

“Guarda el valor 1 en la propiedad propiedad del objeto objeto.”

objeto.propiedad = 1;

Page 177: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

¿Qué significa?

“Guarda el valor 1 en la propiedad propiedad del objeto objeto. Si no la encuentras, créala!”

objeto.propiedad = 1;

Page 178: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

peso 1

proto Object

plumaplomoproto pluma

var pluma = { peso: 1};

var plomo = clone(pluma);

Page 179: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

peso 1

proto Object

plumaplomoproto pluma

plomo.peso; // 1

Page 180: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

peso 1

proto Object

plumaplomoproto pluma

peso 100

plomo.peso = 100;

Page 181: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

Es decir:

• Hay asimetría entre escritura y lectura!

• Lectura: busca en la cadena

• Escritura: crea una nueva propiedad

• Es el comportamiento natural

• Uso eficiente de la memoria: solo se crean los valores diferentes.

Page 182: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: prototipos

¿Qué sucede?var Lista = { elementos: []};

var laCompra = clone(Lista);

laCompra.elementos.push("Leche");laCompra.elementos.push("Huevos");

var toDo = clone(Lista);toDo.elementos.push("Contestar emails");toDo.elementos.push("Subir a producción");

toDo.elementos;

Page 183: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

prototipos

Object.create(proto)• Igual que clone

• Nativo en algunos navegadores

var pluma = { peso: 1, enStock: true,};

var plomo = Object.create(pluma);plomo.peso = 100;

Page 184: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

¡Se acabaron los prototipos!

Page 185: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

Sólo una idea importante más: ámbitos

Page 186: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

• Una idea sencilla, pero difícil de explicar

• Están por todas partes

• Consecuencia natural del lenguaje

• ¡Muy útiles!

Page 187: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function clausurator() { var a = 1; return function() { return a; };}

Page 188: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function clausurator() { var a = 1; return function() { return a; };}

var fn = clausurator();typeof fn;

Page 189: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function clausurator() { var a = 1; return function() { return a; };}

var fn = clausurator();fn(); // ???

Page 190: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function clausurator() { var a = 1; return function() { return a; };}

var fn = clausurator();fn();

fn = function() { return a;}

Page 191: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function clausurator() { var a = 1; return function() { return a; };}

var fn = clausurator();fn();

fn = function() { return a;}

Page 192: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function clausurator() { var a = 1; return function() { return a; };}

var fn = clausurator();fn();

fn = function() { return a;}

Page 193: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function clausurator() { var a = 1; return function() { return a; };}

var fn = clausurator();fn();

fn = function() { return a;}

a = 1;

Page 194: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

Otro caso:function makeContador() { var i = 0; return function() { return i++; }}

var contador1 = makeContador();contador1(); // ???contador1(); // ???

var contador2 = makeContador();contador2(); // ???

Page 195: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

Otro caso:function makeContador() { var i = 0; return function() { return i++; }}

var contador1 = makeContador();contador1(); // 0contador1(); // 1

var contador2 = makeContador();contador2(); // 0

Page 196: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function makeContador() { var i = 0; return function() { return i++; }}

var contador1 = makeContador();contador1(); // 0contador1(); // 1

var contador2 = makeContador();contador2(); // 0

contador1 = function() { return i++;}

i = 0;

Page 197: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function makeContador() { var i = 0; return function() { return i++; }}

var contador1 = makeContador();contador1(); // 0contador1(); // 1

var contador2 = makeContador();contador2(); // 0

contador1 = function() { return i++;}

i = 1;

Page 198: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function makeContador() { var i = 0; return function() { return i++; }}

var contador1 = makeContador();contador1(); // 0contador1(); // 1

var contador2 = makeContador();contador2(); // 0

contador1 = function() { return i++;}

i = 1;

contador2 = function() { return i++;}

i = 0;

Page 199: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

function interesante() { var algo = 0; return { get: function() { return algo; }, set: function(valor) { return algo = valor; } };}

var obj = interesante();obj.get(); // ???obj.set("hola!");obj.get(); // ???

Page 200: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

• bind: fija una función a un contexto

function bind(ctx, fn) { return function() { return fn.apply(ctx, arguments); }}

Page 201: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

• curry: aplicación parcial de una función

function curry(fn) { var slice = Array.prototype.slice, args = slice.call(arguments, 1); return function() { var newargs = slice.call(arguments); return fn.apply(this, args.concat(newargs)); };}

Page 202: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Clausuras

Es decir:

• Las clausuras son función + entorno

• Asocian datos a funciones

• No se puede acceder directamente a las variables clausuradas desde el exterior de la función

• Duración indefinida

• ¡Son muy útiles!

Page 203: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

function PseudoConstructor() { var self = {}; self.propiedad = "valor"; return self;}

var pseudoInstancia = PseudoConstructor();pseudoInstancia.propiedad; // "valor"

Page 204: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

function PseudoConstructor() { var self = {}; self.propiedad = "valor"; self.metodo = function(nombre) { return "No te duermas, " + nombre + "!"; }; return self;}

var pseudoInstancia = PseudoConstructor();pseudoInstancia.metodo("Abraham");

Page 205: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

function PseudoConstructor() { var self = {}; self.propiedad = "valor"; self.metodo = function(nombre) { return "No te duermas, " + nombre + "!"; }; return self;}

var pseudoInstancia = PseudoConstructor();pseudoInstancia.metodo("Abraham");

Page 206: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

function PseudoConstructor() { var self = {}, propiedad = "privada!"; var metodoPrivado = function(s) { return s.toUpperCase(); } self.metodo = function(nombre) { var mayus = metodoPrivado(nombre); return "No te duermas, " + mayus + "!"; }; return self;}

var pseudoInstancia = PseudoConstructor();pseudoInstancia.metodo("Abraham");

Page 207: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

1. Crear un pseudoconstructor

2. Definir una variable self con un objeto vacío

3. Añadir las propiedades/métodos públicos a self

4. Devolver self

Page 208: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

¿Y para heredar?

Page 209: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

¿Y para heredar?function A() { var self = {}; self.uno = 1; return self;}

function B() { var self = A(); self.dos = 2; return self;}

var b = B();b.uno; // 1

Page 210: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

¿Cómo llamar al supermétodo?

Page 211: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

function A() { var self = {}; self.metodo = function() { console.log("A"); } return self;}

function B() { var self = A(); var superMetodo = self.metodo; self.metodo = function() { superMetodo(); console.log("B"); } return self;}

Page 212: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

“Herencia funcional”:

✓ Explotar clausuras y objetos en linea

✓ Extremadamente simple e intuitivo

✓ Mejor encapsulado público/privado

✓ Poco ruido sintáctico

✓ No hacen falta helpers ni librerías

Page 213: Javascript para Profesionales - WordPress.comObjetos! Referencias! Todo son objetos excepto: strings, números, booleans, null o undefined Strings, números y booleans se comportan

Intermedio: herencia funcional

“Herencia funcional”:

✓ Explotar clausuras y objetos en linea

✓ Extremadamente simple e intuitivo

✓ Mejor encapsulado público/privado

✓ Poco ruido sintáctico

✓ No hacen falta helpers ni librerías

๏ Un poco... ¿cutre?

๏ No es la manera más popular

๏ ¡Peor uso de la memoria!