Help, programación orientada a objetos javascript

W0rd

A ver si alguien me puede echar una mano.

Tengo la "clase" factura

function Factura(empresa,cliente){
	this.empresa = empresa;
	this.cliente = cliente;
	this.lineasFactura = [];
	this.importeTotal = 0;
	this.insertarArticulo = function(articulo){
		console.log("estado de lineas factura:" + typeof lineasFactura);
		this.lineasFactura[lineasFactura.length] = articulo;
	}
	this.eliminarLinea = function(linea){
		this.lineasFactura.splice(linea-1,1);
	}
	this.importeTotal = function(){
		for (var i = 0; i < this.lineasFactura.length; i++) {
			this.importeTotal+= this.lineasFactura[i].getPrecioFinal();
		}
	}
}

La empresa y cliente son objetos.

El problema que tengo es que el constructor no me inicializa this.lineasFactura = [];, me lo deja undefined cuando debería ser un array vacio.

Maldercito

Te lo inicializa bien. Tu problema es otro.

¿Te han explicado como funciona el contexto en programación?

En el método this.insertaArticulo, llamas al elemento this.lineasFactura. Igual que en this.eliminarLinea y this.importeTotal. Dentro de esos métodos, this, hace referencia al propio método, por eso no encuentra el array al que pushear o hacer el splice. Lo que debes hacer al principio es una variable que contenga el contexto de la "clase". Pon por ejemplo:

var context = this;

Y luego dentro cuando quieras acceder a elementos de la clase dentro de tus métodos, usa context.EL_NOMBRE_DE_LA_PROPIEDAD, en este caso, context.lineasFactura.

3 2 respuestas
d253

#1 sabes que en JS ES2015 existe Class?

class Factura {
  constructor(empresa, cliente) {
    this._empresa = empresa;
    this._cliente = cliente;
    this._lineasFactura = [];
    this._importeTotal = 0;
  }

  insertarArticulo(articulo) {
    console.log("estado de lineas factura:" + typeof this._lineasFactura);
    this._lineasFactura.push(articulo);
  }

  eliminarLinea(linea){
    this._lineasFactura.splice(linea-1,1);
  }

  importeTotal(){
    this._lineasFactura.forEach(lineaFactura => {
      this._importeTotal+= this._lineasFactura[i].getPrecioFinal();
    });
  }
}
1 respuesta
liebgott

Ahi tienes todo lo q necesitas saber sobre el this y el tema de las "clases"

https://github.com/getify/You-Dont-Know-JS/tree/master/this%20%26%20object%20prototypes

2
W0rd

#2 Esta noche lo pruebo, según entiendo al indicar el this dentro del método piensa que la propiedad esta dentro del método y no de la clase?

#3 Lo había visto pero creo recordar que aun hay navegadores que no lo soportan, no? Se ve mucho mejor, al estilo de otros lenguajes, como java.

2 respuestas
bazoo

Añade 'this.' delante de 'lineasFactura'

console.log("estado de lineas factura:" + typeof this.lineasFactura);
...
this.lineasFactura[this.lineasFactura.length] = articulo;

edit: #2 no se ha enterado de que va el tema

1 respuesta
Maldercito

#5 Correcto. Busca una propiedad inexistente dentro del método. Y si, también podrías utilizar clases de ES2015 pero luego debes utilizar un transpapilador como Babel para convertir ese código a ES5 para darle compatibilidad con navegadores antiguos.

1 respuesta
cabron

#5

http://caniuse.com/#feat=es6-class

Y de todas formas no es igual que las clases en java, siguen siendo clases de js normales, solo que con una sintaxis más simple que andar asignando cosas al prototipo, pero por debajo hace lo mismo.

1 respuesta
W0rd

#6 Perfecto, parece ser que lo de #7 no es correcto, supongo que la confusión estaría si hubiese una variable dentro del método con el mismo nombre y para diferenciar los "this" definir uno superior diferente.
#8 Esta bien saberlo, gracias ;)

Usuarios habituales

  • W0rd
  • cabron
  • Maldercito
  • bazoo
  • liebgott
  • d253