JS:嵌套函数v原型

时间:2013-06-17 12:26:29

标签: javascript prototype

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

所以我被迫使用嵌套函数或重复自己,还是有办法使用原型来完成这项工作?

3 个答案:

答案 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?