2

我在 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
}

那么我是否被迫使用嵌套函数或重复自己,或者有没有办法使用原型来完成这项工作?

4

3 回答 3

5

改变

function MyOb(data) {
    var myData;
    addData(data);
}

function MyOb(data) {
    this.myData = {}; // or another initialization
    this.addData(data);
}

您需要thisJavaScript 对象中的显式。

另请注意, usingvar myData使其成为私有:您将无法从构造函数外部定义的函数(包括addData函数)中使用此变量。这就是为什么你可能需要this.myData

于 2013-06-17T12:28:10.620 回答
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,并且您的代码将无法工作

于 2013-06-17T12:28:31.093 回答
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:我是否需要为对象中的每个变量放置 this.var?.

于 2013-06-17T12:28:49.167 回答