Javascript prototype.toString()的重写在OOP函数中不起作用

Javascript prototype.toString()的重写在OOP函数中不起作用,javascript,overriding,prototype,tostring,Javascript,Overriding,Prototype,Tostring,我正在尝试重写我正在创建的JavaScript对象中的.toString()。然而,这似乎并不值得尊敬 这是一段有问题的代码: const FormBuilderObject=function(){ var类别=[]; var问题=[]; 返回{ initCategory:function(){ 返回新类别(); }, 初始问题:函数(){ 返回新问题(); }, getQuestions:function(){ 回答问题; }, getCategories:function(){ 退货类别;

我正在尝试重写我正在创建的JavaScript对象中的.toString()。然而,这似乎并不值得尊敬

这是一段有问题的代码:

const FormBuilderObject=function(){
var类别=[];
var问题=[];
返回{
initCategory:function(){
返回新类别();
},
初始问题:函数(){
返回新问题();
},
getQuestions:function(){
回答问题;
},
getCategories:function(){
退货类别;
},
addCategory:函数(类别){
类别。推送(类别);
},
添加问题:功能(问题){
问题。推(问题);
}
}
};
FormBuilderObject.prototype.toString=函数(){
返回“回声基地”;
}
var f=新FormBuilderObject();

警报(f)
JS允许构造函数通过返回替代对象来覆盖
新的
对象。因此,
newformbuilderObject()
只是给出从
object.prototype继承的返回的普通对象,而不是从
FormBuilderObject继承的对象

至于要做什么,您可以向返回的对象添加一个
toString
方法,不过通常您只需将
类别
问题
数组直接放在
新的
对象上,但是,请使用前导下划线命名它们,以表示它们不能直接访问。

原因是

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

新关键字执行以下操作

4.如果函数不返回自己的对象,则返回此

因此,如果
返回构造函数中的某个内容,则该变量将不会是构造函数的实例

您应该向
中添加方法,如下所示

const FormBuilderObject=function(){
var类别=[];
var问题=[];
this.initCategory=函数(){
返回新类别();
}
this.initQuestion=函数(){
返回新问题();
}
this.getQuestions=函数(){
回答问题;
}
this.getCategories=函数(){
退货类别;
}
this.addCategory=函数(类别){
类别。推送(类别);
}
this.addQuestion=函数(问题){
问题。推(问题);
}
};
FormBuilderObject.prototype.toString=函数(){
返回“回声基地”;
}
var f=新FormBuilderObject();

警报(f)