【问题标题】:Object defaulting to last defined object对象默认为最后定义的对象
【发布时间】:2018-12-17 22:02:45
【问题描述】:

所以我有一个对象构造函数,但是当我尝试放入一个对象时,数组cmndlist 总是定义了最后一个对象的 x 数量。 (基本上它们都以相同的方式结束)

function command(name, category, help, callback) {
    this.name = name;
    this.help = help;
    this.use = callback;

    cmndlist[category].push(this);
}; 

这也是我定义对象的代码。

command("foo",0,"foo", function(message){
    //code
});

command("bar",1,"bar", function (message){
    //code
}); 

command("foobar",1,"foobar", function (message){
    //code
}); 

所以在本例中,数组中的所有对象都将具有与foobar 相同的属性。

我不希望这样,我希望它拥有所有三个对象。

【问题讨论】:

  • 如果你想知道,第一个片段也出现在stackoverflow.com/questions/53808062/…
  • 什么是cmndlist & 为什么没有new
  • 使用新的关键字。
  • @MarkMeyer 这是一个对象所在的数组。
  • 如果不使用newthiswindow 对象,而不是原型的实例。

标签: javascript object constructor


【解决方案1】:

要获得一个新对象,我们需要在调用命令之前添加“新”。否则我们每次都引用同一个对象实例。 在这里查看 JavaScript 中对象构造的描述。 https://www.w3schools.com/js/js_object_constructors.asp

var cmndlist = [];

function command(name, category, help, callback) {
    this.name = name;
    this.help = help;
    this.use = callback;

    if(cmndlist.hasOwnProperty(category) == false) cmndlist[category] = [];

    cmndlist[category].push(this);
}; 


new command("foo",0,"foo", function(message){
    //code
});

new command("bar",1,"bar", function (message){
    //code
}); 

new command("foobar",1,"foobar", function (message){
    //code
}); 

【讨论】:

  • 请在答案中说明您更改了什么以及为什么需要更改。
  • 我们需要一个'new'调用来创建一个新的对象实例,否则我们的调用只是引用一个对象。 (注意对命令的调用现在前面有新的)。对象是通过引用传递的(本质上是一个指向实际对象的地址指针)所以当我们添加到数组而不调用 new 时,我们只是添加了一个指向同一个对象的新指针。
  • Per @Bergi 我会考虑一种更像 let newCommand = new Command(x,y,z); 的语法然后追加。以后将易于阅读和维护。
  • @PaulThomas "否则我们的调用只是引用单个对象" - 是哪个对象?将其添加到解释中将有很大帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-11
  • 2018-01-08
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 2020-06-06
  • 2014-05-20
相关资源
最近更新 更多