Javascript prototype.toString()的重写在OOP函数中不起作用
我正在尝试重写我正在创建的JavaScript对象中的.toString()。然而,这似乎并不值得尊敬 这是一段有问题的代码: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(){ 退货类别;
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)我怀疑这与第一个函数中的返回{}有关。但是,我不确定还要做什么才能公开某些函数。我希望.toString()可以让我在调用或调用时显式呈现返回对象。我不知道构造函数能够覆盖新对象!这对我来说是全新的!它会被下划线保护吗?@BarryChapman:是的,很奇怪。只有对象是这样工作的,而不是原语。不,这只是一种惯例,用这种方式使用下划线。有趣。那么,构造“新”对象的最佳方式是什么?使该对象易于序列化的最佳方式是什么?