0

Es una duda de buena práctica. El código Javascript me funciona correctamente y creo saber si las funciones en Javascript, así también las clases o métodos constructores si se definen como acabo de realizar. ¿Es una buena práctica utilizar una variable GLOBAL para guardar la función?

 var Tienda = function(){ ...todas las funciones, variables, toString()... }

Os dejo el código completo:

//Clase Tienda. Constructor sin parametros.
var Tienda = function(){
    //Creamos un array de discos.
    this.numTotalDiscos = new Array();

    //Devuelve el numero total de discos.
    this.getNumeroDiscos = function(){
        return this.numTotalDiscos.length;
    }

    //Devuelve el numero de discos que no estan prestados.
    this.getNumeroDiscosDisponibles = function(){
        var cantidad = 0;
        for(var i=0; i<this.numTotalDiscos.length; i++){
            if(this.numTotalDiscos[i].prestado==false){
                cantidad++;
            }
        }
        return cantidad;
    }

    //Añade un disco al array.
    this.addDisco = function(disco){
        this.numTotalDiscos.push(disco);
    }

    //Muestra los titulos de los discos almacenados.
    this.getTituloDisco = function(i){
        return this.numTotalDiscos[i].titulo;
    }

    //Devuelve el objeto Disco que esta en la posicion i-esima.
    this.getDisco = function(pos){
        return this.numTotalDiscos[pos];
    }

    //Elimina el disco cuyo titulo coincide con el que se pasa como parametro.
    this.deleteDisco = function (titulo){
        for(var i=0; i<this.numTotalDiscos.length; i++){
            if(this.numTotalDiscos[i].nombre == titulo){
                this.numTotalDiscos.splice(i,1);
                break;
            }
        }
    }

    //Devuelve verdadero si existe el disco cuyo titulo coincide con el que se pasa.
    this.existeDisco = function(tituloRecibido){
        var existe = false;
        for(var i=0; i<numTotalDiscos.length;i++){
            var titulo = this.numTotalDiscos[i].nombre;
            if(titulo==tituloRecibido)
                existe = true;
                break;
        }
        return existe;
    }

    //Modifica el titulo de un disco si existe.
    this.modificaDisco = function(titulo, nuevoDisco){
        for(var i=0; i<this.numTotalDiscos.length; i++){
            if(this.numTotalDiscos[i].nombre == titulo){
                this.numTotalDiscos[i] = nuevoDisco;
                break;
            }
        }   
    }
}


//Creamos una tienda, y en ella insertamos varios discos para comprobar el funcionamiento.
var miTienda = new Tienda();
var miDisco1 = new Disco("MachupichuPop111", "Osmar111", 1989, "pop", 3);
miDisco1.presta(true);
var miDisco2 = new Disco("MachupichuPop222", "Osmar222", 1990, "pop", 8);
var miDisco3 = new Disco("MachupichuPop333", "Osmar33", 1956, "indie", 11);
miDisco3.presta(false);
miTienda.addDisco(miDisco1);
miTienda.addDisco(miDisco2);
miTienda.addDisco(miDisco3);
console.log(miDisco1);
console.log(miDisco2);
console.log(miDisco3);
console.log("Tengo "+miTienda.getNumeroDiscos()+ " disco/s en la tienda");
console.log("Tengo "+miTienda.getNumeroDiscosDisponibles()+ " disco/s prestados en mi tienda");
console.log("En la posicion 3 está el objeto Disco:[[[ "+miTienda.getDisco(2)+" ]]]"); //[2] es la posicion 3, empieza a contar el array desde pos[0].
rnrneverdies
  • 16,491
  • 3
  • 49
  • 79
omaza1990
  • 2,722
  • 32
  • 82
  • 143
  • 1
    ¿Por qué no usar las [**clases**](https://developer.mozilla.org/es/docs/Web/JavaScript/Referencia/Classes) implementadas en el **ES6** ? – Jorius May 23 '17 at 15:43
  • ¿ES6? No entiendo esas siglas, perdón. – omaza1990 May 23 '17 at 15:45
  • ES es una abreviación de ECMAScript el cual es la especificación o estándar de JavaScript. Pregunta relacionada https://es.stackoverflow.com/q/932/65 (esta podría ser duplicado de aquella) – Rubén May 23 '17 at 16:13

1 Answers1

0

Implementó las Clases con los estándares que sigue de ECMAScript en su versión ES6, por lo tanto, creo que sería oportuno y asertivo dejar de crear "clases" mediante funciones anónimas y funciones anónimas auto invocadas, es decir; creo que debería dejar de hacerse esto:

var Tienda = function(nombre) {
  // Clase tienda creada mediante una función anónima simple
  this._nombre = nombre;

  // Método público para devolver el nombre de la tienda
  this.getNombre = function() {
    return this._nombre;
  }

}

var miTienda = new Tienda("McDonalds");
console.log(miTienda.getNombre());

var Tienda2 = (function() {
  // Clase tienda creada mediante una función anónima auto invocada

  // Constructor
  function Tienda2(nombre) {
    this._nombre = nombre;
  }

  // Método privado para obtener el nombre
  function getNombre() {
    return this._nombre;
  }

  // Método público para obtener el nombre
  Tienda2.prototype.nombre = function() {
    return getNombre.call(this);
  }

  return Tienda2;

})();

var miTienda2 = new Tienda2("Musica store");
console.log(miTienda2.nombre());

Y empezar a usar nativamente las Clases propuestas por el propio javascript de la siguiente forma:

// Clase
class Tienda {

  // Constructor
  constructor(nombre) {
    this._nombre = nombre;
  }
  
  // Método para devolver el nombre de la tienda
  get nombre(){
    return this._nombre;
  }
  
}

var miTienda = new Tienda("La vaquita");
console.log(miTienda.nombre);
Jorius
  • 6,109
  • 9
  • 28
  • 55