繁体   English   中英

Javascript Arrays 作为 object 字段

[英]Javascript Arrays as an object field

我在使用数组作为 Javascript 字段时遇到了问题。

var Object = function () {

  var admins = [];

  this.addAdmin = function(admin){
    this.admins.push(admin)
  }

}

通常我希望管理员被推送到数组管理员中,但我得到一个“无法读取未定义的属性‘推送’”。

如果我在使用 new Object() 初始化 Object 时没记错的话,admins = []; 应该初始化数组。 这是 Javascript 的限制吗?

先感谢您。

var array创建一个局部变量 它不会在 object 上创建属性

你需要:

this.admins = [];

或者

admins.push(admin) /* without this */

在您的 function 中, admins是 function 的局部变量。 您需要将admins声明为实例的属性。

function Obj(){
    this.admins = [];
}
Obj.prototype.addAdmin = function(admin){
    this.admins.push(admin);
}

obj = new Obj();
obj.addAdmin('tester');

此外,因为Object是全局基础 object,所以不要创建名为Object的函数或对象。

我怀疑您已经感到困惑(这很容易:-)) ,因为您已经看到了这样的代码:

class Obj {
    admins = [];

    addAdmin(admin) {
        this.admins.push(admin);
    }
}

它使用现代classclass 字段语法将admins属性放在通过new Obj构造的 object 上。 (请注意,在admins = [];之前没有var 。)但是在您的代码中,您使用了较旧的基于function的语法。 在您的 function 中, var admins = []; 只是创建一个局部变量,而不是一个属性。

我建议如果你想创建构造函数,使用上面新的class语法是更简单、更强大的方法。 但是,如果您想使用较旧的语法,其他答案已经显示了如何,但为了完整起见,要么让admins成为 object 的属性:

let Obj = function() {
    this.admins = []; // ***
  
    this.addAdmin = function(admin){
        this.admins.push(admin)
    };
};

或者也许在prototype上使用addAdmin

let Obj = function() {
  this.admins = []; // ***
};
Obj.prototype.addAdmin = function(admin){
    this.admins.push(admin)
};

或使用addAdmins关闭对Obj的调用这一事实,因此本地admins

let Obj = function() {
    const admins = [];
  
    this.addAdmin = function(admin){
        admins.push(admin) // <=== No `this.` here, you want to close over the
                           // `admins` local
    };
};

我假设Object是占位符,因为它是保留关键字。

发生的事情是,您的变量var admins = []; 是在本地创建的,无法通过 this 访问。 因此,当您在this.admins.push(admin)中设置值时,管理员未定义。 你应该修改你的 function 以这样阅读

 var Obj = function () { this.admins = []; this.addAdmin = function (admin) { this.admins.push(admin); }; }; const object = new Obj(); object.addAdmin(1);

如果您打算更新 function,则不应像这样省略 this 关键字(没有双关语)。 坚持上面的代码。

 var Obj = function () { var admins = []; this.addAdmin = function (admin) { admins.push(admin); }; }; const object = new Obj(); console.log(object)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM