【问题标题】:Accessing a class function with array of objects使用对象数组访问类函数
【发布时间】:2018-04-17 04:00:14
【问题描述】:

我在 p5.js 中编码,我注意到一个我无法通过的问题。

我有一个名为“Boxes”的课程。我已经在使用“盒子”的功能了。但是,当我尝试使用该函数应用于对象数组时,它不起作用。我该如何解决这个问题?

class Boxes
{
    constructor()
    {
        this.x;
        this.y;
        this.r=222;
        this.g=55;
        this.b=111;
    }

    show()
    {
        fill(this.r,this.g,this.b);
        rect(this.x,this.y,50,50);
    }
}

对于标准变量,它可以像这样完美地工作。

var box1 = new Boxes();
box1.show(); // It works.

当我尝试不同的东西时它不起作用。下面的例子。

var myboxes = [{'x':this.x, 'y':this.y}]; // That's OK :)

myboxes.push({x:100, y:100}); // That's OK too :)

myboxes[1].show(); // But. It gives an error :/

上面写着:“myboxes[1].show 不是函数”

虽然我用括号编写了 show() 函数。它说 “myboxes[1].show 不是一个函数”当我使用它时它工作正常 box1.show()。如何使用对象数组访问函数? 我要试试别的吗?你有什么建议?

【问题讨论】:

  • 在box1 的情况下,您实际上创建了一个Boxes 对象。在数组示例中你没有。
  • myboxes 是一个包含 x 和 y 的对象数组。上面没有show() 函数。你想达到什么目的?
  • 我试图将 show() 函数添加到这一行,但我做不到。有什么方法可以实现吗? var myboxes = [{'x':this.x, 'y':this.y}]; 我试过 var myboxes = [{'x':this.x, 'y':this.y, 'show':this.show()}]; 当然它也没有用。有什么建议吗?

标签: javascript class oop p5.js


【解决方案1】:

如果你想拥有一个 Boxes 数组,你可以 .push() 新对象如:

class Boxes {
  constructor(param) {
    this.x = param.x;                     //Assign the x   
    this.y = param.y;                     //Assign the y
    this.r = 222;
    this.g = 55;
    this.b = 111;
  }

  show() {
    console.log(this.x, this.y);          //Test code,

    //fill(this.r,this.g,this.b);
    //rect(this.x,this.y,50,50);
  }
}

var myboxes = [];
myboxes.push(new Boxes({x: 3,y: 20}));     //Create a new box and push to the array
myboxes.push(new Boxes({x: 30,y: 200}));   //Create anothe one and push to the array

myboxes[1].show();                         //<-- You can show the x and y of element 1

【讨论】:

  • 非常感谢。但是我尝试使用 show() 函数来推送 myboxes[2]。然后它说 Cannot read property 'show' of undefined
  • 数组从0开始计数。所以你可以myboxes[0].show();或myboxes[1].show();
  • myboxes[1].show(); 实际上是第二个.push() @fighg
  • 我必须使用“param”关键字吗?如果我写this.x=350; 首先代码获取我们的 push() 函数编号,然后一直使用它。但我要先声明,谁也改变不了
  • @fighg 你不一定要使用param(构造函数)。有几种方法可以为对象的属性赋值。而你不能在类代码块之外使用this。 this 在类块之外可能意味着不同的事情
【解决方案2】:

如果您创建一个非 Boxes 对象,它的原型链中的任何位置都没有 show。不过没关系,如果您有权访问该类,则可以使用非 Boxes 对象作为 this 调用原型方法:

class Boxes {
  show() {
    console.log(this.x);
  }
}

var myboxes = [{'x':this.x, 'y':this.y}];
myboxes.push({x:100, y:100});
Boxes.prototype.show.call(myboxes[1]);

但请注意,您还需要将 r、g 和 b 属性放在非 Boxes 对象上,以便 show 工作。

【讨论】:

  • 感谢您的回答。有效。但是当我使用push() 函数var myboxes = [{'x':this.x, 'y':this.y}]; 时,这些x 和y 在一步之后首先由计算机获取,并且永远使用我的构造函数的值。如果我尝试在构造函数中保持清除 x 和 y,那么它不会识别 x 和 y。如何将 x、y 等变量分配给我的对象的 x、y、r、g、b 之一?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-28
相关资源
最近更新 更多