我试图在我正在创建的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);
这一个返回“回声基数”
我不太清楚为什么第一个不起作用,但第二个是。语法大致相同?
还有其他我正在做的事情,我不知道吗?
原因是
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);
JS允许构造函数通过返回备用对象来覆盖new
对象。因此,new FormBuilderObject();
只是给返回的普通对象继承自Object.prototype
,而不是继承自FormBuilderObject
的对象。
至于要做什么,你可以添加一个toString
方法到返回的对象,虽然通常你只是将categories
和questions
数组直接放在new
对象上,但用一个前导下划线命名它们表示它们是不被直接访问。