JS:嵌套函数v原型

JS: nested function v prototype

本文关键字:原型 函数 嵌套 JS      更新时间:2023-09-26

我在Javascript中有一个对象,并且希望使用一个函数来处理传递给构造函数的数据,该函数稍后可以在外部调用更多数据。当然,我不想重复代码(一次在构造函数中,一次在函数中),那么我应该如何最好地设置它呢?

我可以使用嵌套函数,但我被告知这是低效的:

function MyOb(data) {
    this.myData = {};
    function addData(newData) {
        //Add newData to myData
    }
    addData(data);
}

但是如果我使用一个原型,我得到一个"不能找到变量addData"错误在第3行:

function MyOb(data) {
    this.myData = {};
    addData(data);
}
MyOb.prototype.addData = function(newData) {
        //Add newData to myData
}

所以我被迫要么使用嵌套函数或重复自己,或者有一种方法使这个工作使用原型?

变化

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代替。

使用原型,您需要创建一个新对象:

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,并且您的代码将无法工作

您应该将嵌套函数作为对象的属性公开可用:

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:我需要把这个。