我在Javascript中有一个对象,并希望使用一个函数处理传递给构造函数的数据,该函数稍后可以使用更多数据从外部调用。当然我不想复制代码(一次在构造函数中,一次在函数中),那么我应该如何最好地设置它?
我可以使用嵌套函数,但我被告知这是低效的:
function MyOb(data) {
this.myData = {};
function addData(newData) {
//Add newData to myData
}
addData(data);
}
但如果我使用原型,我会在第3行找到“找不到变量addData”错误:
function MyOb(data) {
this.myData = {};
addData(data);
}
MyOb.prototype.addData = function(newData) {
//Add newData to myData
}
所以我被迫使用嵌套函数或重复自己,还是有办法使用原型来完成这项工作?
答案 0 :(得分:5)
更改
function MyOb(data) {
var myData;
addData(data);
}
到
function MyOb(data) {
this.myData = {}; // or another initialization
this.addData(data);
}
您需要JavaScript对象中的显式this
。
另请注意,使用var myData
会使其成为私有:您将无法在构造函数外部定义的函数中使用此变量,包括addData
函数。这就是为什么你可能需要this.myData
。
答案 1 :(得分:1)
使用原型,您需要创建一个新对象:
var abc = new MyOb(data);
然后您可以使用this
:
function MyOb(data) {
var _myData; // local variable in this scope (addData won't have access)
this.myData = {}; // public variable
this.addData(data);
}
如果您不使用new
来构建对象,那么this
将是window
,您的代码将无效
答案 2 :(得分:1)
您应该将嵌套函数作为对象的属性公开提供:
function MyOb(data) {
var myData;
function addData(newData) {
//Add newData to myData
}
addData(data);
this.addData = addData;
}
您当前使用原型的代码遇到的问题是您尝试将函数变为变量,而它是您实例的(继承)属性(由this
引用)。但是,将其更改为
this.addData(data);
会导致原型函数中的错误can't find variable myData
- 它是构造函数本地的变量。你必须使这个实例属性也使用原型。另请参阅Javascript: Do I need to put this.var for every variable in an object?。