Переопределение prototype.toString () не работает в функции ООП - PullRequest
1 голос
/ 15 марта 2019

Я пытаюсь переопределить .toString () в создаваемом мной объекте JavaScript.Однако, это, кажется, не соблюдается.

Это фрагмент кода, о котором идет речь:

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);

Это дает "[объект-объект]", что неверно.

Однако, делая это так - работает:

    var Foof = function() {}

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

    var F = new Foof();

    alert(F);

Этот возвращает "эхо-базу"

Я не совсем уверен, почему первый не работает, а второй работает.Синтаксис примерно такой же?

Есть ли что-то еще, что я делаю, о котором я не знаю?

Ответы [ 2 ]

1 голос
/ 15 марта 2019

Причина этого

console.log(f instanceof FormBuilderObject) //false

Когда вы используете ключевое слово new, оно автоматически возвращает объект this, который является экземпляром этого конструктора. Но здесь вы не возвращаете этот экземпляр, а вместо этого возвращаете свой собственный объект, который не является экземпляром FormBuilderObject

Новое ключевое слово выполняет следующие действия

4. Возвращает this, если функция не возвращает свой собственный объект.

Так что если вы return что-то внутри конструктора, переменная не будет экземпляром конструктора

Вы должны добавить метод к this, как показано ниже

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 голос
/ 15 марта 2019

JS позволяет конструкторам переопределять объект new, возвращая альтернативный объект. Следовательно, new FormBuilderObject(); просто возвращает возвращенный простой объект, который наследуется от Object.prototype, а не тот, который наследуется от FormBuilderObject.

Что касается того, что делать, вы можете добавить метод toString к возвращаемому объекту, хотя обычно вы просто помещаете массивы categories и questions непосредственно в объект new, но имя их с подчеркиванием, указывающим на то, что к ним нет прямого доступа.

...