Экземпляры объектов Javascript теряют доступ к функциям при вызове массива - PullRequest
0 голосов
/ 06 марта 2019

У меня есть следующий пример кода:

var cobj = {
  a: 0,
  b: 0,
  c: 0,
  asdinit: function(x, y, w, h) {
    this.a = x;
    this.b = y;
    this.c = w;
    this.h = h;
  },
  adsfads: function(a, b, c, d) {
    this.a = a;
    this.b = b;
    this.c = c;
  }
}

var c = new cobj.asdinit(1, 1, 1, 1);
var bigarray = []
for (t = 0; t < 10; t++) {
  var newobj = new cobj.asdinit(1, 1, 1, 1);
  bigarray.push(newobj);
}
for (t = 0; t < 10; t++) {
  var localobj = bigarray[t];
  localobj.adsfads(1, 1, 1, 1);
}

Во время создания объекта - все функции доступны для вызова.После и после вызова из массива функции недоступны?

Ответы [ 2 ]

1 голос
/ 06 марта 2019

Вы используете функции asdinit и adsfads в качестве конструкторов.Объекты, созданные из каждой конструкции, имеют только свойства a, b и c.У них нет методов-прототипов.

Я думаю, что вы на самом деле ищете

class cobj {
  constructor (x, y, w, h) {
    this.a = x
    this.b = y
    this.c = w
    this.h = h
  }
  
  adsfads (a, b, c, d) {
    this.a = a
    this.b = b
    this.c = c
  }
}

var bigarray = []
for (t = 0; t < 2; t++) {
  var newobj = new cobj(t, t, t, t);
  bigarray.push(newobj);
}
for (t = 0; t < 2; t++) {
  var localobj = bigarray[t];
  localobj.adsfads(t + 1, t + 1, t + 1, t + 1);
  console.log(localobj)
}

См. https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Classes


Эквивалент ES5 будет выглядеть примерно так:

function cobj(x, y, w, h) {
  this.a = x
  this.b = y
  this.c = w
  this.h = h
}

cobj.prototype.adsfads = function(a, b, c, d) {
  this.a = a
  this.b = b
  this.c = c
}
1 голос
/ 06 марта 2019

вы захотите переписать ваш код, чтобы функция возвращала ваши объекты.

var cobj = function() {
  return {
    a: 0,
    b: 0,
    c: 0,
    asdinit: function(x, y, w, h) {
      this.a = x;
      this.b = y;
      this.c = w;
      this.h = h;
    },
    adsfads: function(a, b, c, d) {
      this.a = a;
      this.b = b;
      this.c = c;
    }
  }
}.bind(this)

vat cobjInstance = cobj();
var c = cobjInstance.asdinit(1, 1, 1, 1);
var bigarray = []
for (t = 0; t < 10; t++) {
  var newobj = new cobjInstance.asdinit(1, 1, 1, 1);
  bigarray.push(newobj);
}
for (t = 0; t < 10; t++) {
  var localobj = bigarray[t];
  localobj.adsfads(1, 1, 1, 1);
}

...