No entiendo cómo usar el patrón Object.prototype con clases (es6);

Este es mi código, no estoy seguro, que he usado Object.prototype de la manera correcta

    class Course{ 
     constructor(title, author) {
        this.title = title;
        this.author = author;
      }
    }


    Course.prototype.toString = function (arguments) {
        console.log(this.title + "... Author: " + this.author);
    };

    var course_1 = new Course("Bootstrap 4", "Paul");
    var course_2 = new Course("Design Patterns", "Paul");

    course_1.toString();
    course_2.toString();

}

¿Debo usar algo diferente?

0
Smart 13 sep. 2018 a las 23:53

3 respuestas

La mejor respuesta

Escribir una aplicación usando clases es6 es una alternativa para desarrollar usando el patrón prototipo directamente.

Bajo el capó, las clases es6 en realidad se compilan hasta la estructura del prototipo. Pero las clases es6 tienden a ser más fáciles de leer, y cuando su aplicación se vuelve muy grande, esto puede marcar la diferencia.

En su caso, colocaría los métodos que desea adjuntar al prototipo dentro de la clase que ha creado. Esto se parece más a la programación orientada a objetos clásica, como vería en C ++ o Java.

Puede leer más sobre las clases es6 en MDN aquí

Por tu ejemplo:

class Course { 
 constructor(title, author) {
    this.title = title;
    this.author = author;
  }

  toString(arguments) {
     console.log(this.title + "... Author: " + this.author);
  }
}

var course_1 = new Course("Bootstrap 4", "Paul");
var course_2 = new Course("Design Patterns", "Paul");

course_1.toString();
course_2.toString();
1
jdavison 13 sep. 2018 a las 21:06

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes

Las clases ES6 son azúcar de sintaxis que le permite evitar el uso de Object.prototype, simplemente defina métodos de clase como este:

    class Course{ 
         constructor(title, author) {
            this.title = title;
            this.author = author;
          }

         toString(arguments) {
            console.log(this.title + "... Author: " + this.author);
        }
    }
4
Vladimir Boretskyi 13 sep. 2018 a las 20:56

En su siguiente código:

class Course {
  constructor(title, author) {
    this.title = title;
    this.author = author;
  }
}


Course.prototype.toString = function(arguments) {
  console.log(this.title + "... Author: " + this.author);
};

var course_1 = new Course("Bootstrap 4", "Paul");
var course_2 = new Course("Design Patterns", "Paul");

course_1.toString();
course_2.toString();

Una clase no es más que azúcar sintáctica que se asemeja a la funcionalidad de una función de constructor. Podemos observar esto con mayor profundidad en el siguiente ejemplo:

class Person {
}

console.log(typeof Person);

La clase Person es en realidad un objeto de función constructor. Al igual que las funciones normales de los constructores, podemos extender el prototipo poniendo propiedades en el objeto prototipo.

Entonces en tu ejemplo:

Course.prototype.toString = function(arguments) {
  console.log(this.title + "... Author: " + this.author);
};

Lo que realmente sucede debajo del capó es que está poniendo una propiedad llamada toString en el objeto de función de constructor Course.

0
Willem van der Veen 13 sep. 2018 a las 21:28