[英]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);
}
}
它使用现代class
和class 字段语法将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.