6 votes

Comment utiliser un objet littéral pour créer une instance d'une classe sans utiliser le constructeur en JavaScript ES6 ?

J'essaie d'apprendre JavaScript ES6 qui est un langage très cool et j'ai pensé que je devrais m'entraîner un peu mais je n'arrive pas à faire un exercice . Alors comment puis-je utiliser l'objet littéral pour copier une classe.

Par exemple, la classe est :

class Point {
  constructor(x, y) {
    this.x = x, this.y = y
  }
  add(other) {
    return new Point(this.x + other.x, this.y + other.y)
  }
}

Et je veux faire quelque chose ici en utilisant l'objet littéral pour rendre la sortie vraie.

var fakePoint = YOUR_CODE_HERE
console.log(fakePoint instanceof Point)

5voto

Bergi Points 104242

J'imagine que cet exercice cherche une solution qui utilise __proto__ comme une clé littérale d'objet - en tant que mentionnés dans les diapositives :

var fakePoint = {
    __proto__: Point.prototype,
    x: Math.random(),
    y: Math.random()
};
console.log(fakePoint instanceof Point)

Cependant, __proto__ est déprécié (à la fois dans les littéraux des objets et en tant que Object.prototype getter / setter) et n'est disponible que dans les navigateurs web en tant que fonctionnalité héritée de la norme ES6, je recommande donc d'éviter ce type de code. La bonne solution est d'utiliser Object.create :

var fakePoint = Object.assign(Object.create(Point.prototype), {
    x: Math.random(),
    y: Math.random()
});
console.log(fakePoint instanceof Point)

0voto

Bergi Points 104242

Juste pour le plaisir, voici une autre approche qui ne correspond probablement pas à l'intention de l'auteur de l'exercice, mais qui peut être considérée comme un objet littéral :

var fakePoint = {
  x: Math.random(),
  y: Math.random(),
  fakeConstructor: Object.defineProperty(Point, Symbol.hasInstance, {
    value(o) { return o.fakeConstructor == this; }
  })
};
console.log(fakePoint instanceof Point)

Il fonctionne en donnant Point a personnalisé hasInstance mise en œuvre qui ne vérifie pas la chaîne de prototypes mais plutôt le fakeConstructor propriété. On pourrait également utiliser "x" in o && "y" in o ou quelque chose de similaire. Bien sûr, il est horrible de faire cet effet secondaire dans le cadre d'un objet littéral, il serait préférable d'écrire

Object.defineProperty(Point, Symbol.hasInstance, {
  value(o) { return o.fakeConstructor == this; /* this === Point */ }
});
var fakePoint = {
  x: Math.random(),
  y: Math.random(),
  fakeConstructor: Point
};

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X