prototype.toString() 的覆盖在 OOP 函数中不起作用
Override of prototype.toString() is not working in OOP function
我正在尝试覆盖我正在创建的 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);
这个returns"echo base"
我不太清楚为什么第一个不起作用但第二个起作用。语法差不多?
是否还有其他我不知道的事情?
JS 允许构造函数通过返回替代对象来覆盖 new
对象。因此,new FormBuilderObject();
只是返回继承自 Object.prototype
的普通对象,而不是继承自 FormBuilderObject
.
的对象
至于要做什么,您可以向要返回的对象添加一个 toString
方法,但通常您只需将 categories
和 questions
数组直接放在new
对象,但用前导下划线命名它们,以表明不能直接访问它们。
原因是
console.log(f instanceof FormBuilderObject) //false
当您使用 new
关键字时,它会自动 return 一个对象 this
,它是该构造函数的实例。但是在这里你不是 return 那个实例,而是 return 你自己的对象,它不是 FormBuilderObject
的实例
The new keyword does the following things
4. Returns this
if the function doesn't return its own object.
所以如果你 return
构造函数内部的东西,变量将不是构造函数的 instanceof
您应该将方法添加到 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);
我正在尝试覆盖我正在创建的 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);
这个returns"echo base"
我不太清楚为什么第一个不起作用但第二个起作用。语法差不多?
是否还有其他我不知道的事情?
JS 允许构造函数通过返回替代对象来覆盖 new
对象。因此,new FormBuilderObject();
只是返回继承自 Object.prototype
的普通对象,而不是继承自 FormBuilderObject
.
至于要做什么,您可以向要返回的对象添加一个 toString
方法,但通常您只需将 categories
和 questions
数组直接放在new
对象,但用前导下划线命名它们,以表明不能直接访问它们。
原因是
console.log(f instanceof FormBuilderObject) //false
当您使用 new
关键字时,它会自动 return 一个对象 this
,它是该构造函数的实例。但是在这里你不是 return 那个实例,而是 return 你自己的对象,它不是 FormBuilderObject
The new keyword does the following things
4. Returnsthis
if the function doesn't return its own object.
所以如果你 return
构造函数内部的东西,变量将不是构造函数的 instanceof
您应该将方法添加到 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);