J'essaie de remplacer .toString() dans un objet JavaScript que je crée. Cependant, il ne semble pas être honoré.

C'est le morceau de code en question:

const FormBuilderObject = function() {
  var categories = [];
  var questions = [];

  return {
    initCategory: function() {
      return new CATEGORY();
    },
    initQuestion: function() {
      return new QUESTION();
    },
    getQuestions: function() {
      return questions;
    },
    getCategories: function() {
      return categories;
    },
    addCategory: function(category) {
      categories.push(category);
    },
    addQuestion: function(question) {
      questions.push(question);
    }
  }
};

FormBuilderObject.prototype.toString = function() {
  return "echo base";
}

var f = new FormBuilderObject();

alert(f);

Cela donne "[object Object]", ce qui est incorrect.

Cependant, en procédant de cette façon, cela fonctionne :

    var Foof = function() {}

    Foof.prototype.toString = function() {
      return "echo base";
    }

    var F = new Foof();

    alert(F);

Celui-ci renvoie "echo base"

Je ne sais pas trop pourquoi le premier ne fonctionne pas mais le second oui. La syntaxe est à peu près la même ?

Y a-t-il autre chose que je fais que je ne connais pas ?

1
Barry Chapman 15 mars 2019 à 05:55

2 réponses

Meilleure réponse

La raison en est

console.log(f instanceof FormBuilderObject) //false

Lorsque vous utilisez le mot clé new, il renvoie automatiquement un objet this qui est l'instance de ce constructeur. Mais ici, vous ne retournez pas cette instance, mais plutôt votre propre objet qui n'est pas une instance de FormBuilderObject

Le nouveau mot-clé fait les choses suivantes

4. Renvoie this si la fonction ne renvoie pas son propre objet.

Donc, si vous return quelque chose dans le constructeur, la variable ne sera pas une instance du constructeur

Vous devez ajouter la méthode à this comme ci-dessous

const FormBuilderObject = function() {
  var categories = [];
  var questions = [];
  this.initCategory = function() {
    return new CATEGORY();
  }
  this.initQuestion = function() {
     return new QUESTION();
  }
  this.getQuestions = function() {
     return questions;
  }
  this.getCategories = function() {
      return categories;
  }
  this.addCategory = function(category) {
      categories.push(category);
  }
  this.addQuestion = function(question) {
      questions.push(question);
  }

};

FormBuilderObject.prototype.toString = function() {
  return "echo base";
}

var f = new FormBuilderObject();

alert(f);
1
Maheer Ali 15 mars 2019 à 03:33

JS permet aux constructeurs de remplacer l'objet new en renvoyant un autre objet. Par conséquent, le new FormBuilderObject(); ne donne que l'objet simple renvoyé qui hérite de Object.prototype, et non celui qui hérite de FormBuilderObject.

En ce qui concerne ce qu'il faut faire, vous pouvez ajouter une méthode toString à l'objet renvoyé, bien que généralement vous mettiez simplement les tableaux categories et questions directement sur le new, mais nommez-les avec un trait de soulignement au début pour indiquer qu'ils ne doivent pas être directement accessibles.

1
ziggy wiggy 15 mars 2019 à 03:10