覆盖prototype.toString()在OOP函数中不起作用

问题描述 投票:1回答:2

我试图在我正在创建的JavaScript对象中覆盖.toString()。但是,它似乎并没有被尊重。

这是有问题的代码:

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

这会产生“[object Object]”,这是不正确的。

但是,这样做 - 工作:

    var Foof = function() {}

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

    var F = new Foof();

    alert(F);

这一个返回“回声基数”

我不太清楚为什么第一个不起作用,但第二个是。语法大致相同?

还有其他我正在做的事情,我不知道吗?

javascript override prototype tostring
2个回答
1
投票

原因是

console.log(f instanceof FormBuilderObject) //false

当您使用new关键字时,它会自动返回一个对象this,它是该构造函数的instanceof。但是在这里你没有返回那个实例,而是返回你自己的对象,而不是FormBuilderObject的实例

new关键字执行以下操作 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
投票

JS允许构造函数通过返回备用对象来覆盖new对象。因此,new FormBuilderObject();只是给返回的普通对象继承自Object.prototype,而不是继承自FormBuilderObject的对象。

至于要做什么,你可以添加一个toString方法到返回的对象,虽然通常你只是将categoriesquestions数组直接放在new对象上,但用一个前导下划线命名它们表示它们是不被直接访问。

© www.soinside.com 2019 - 2024. All rights reserved.