Скрипт Google Apps: массив как свойство объекта одинаков во всех экземплярах объекта - PullRequest
0 голосов
/ 06 марта 2019

У меня есть простой объект с двумя свойствами, одной строкой и одним массивом.Когда я создаю несколько переменных, каждая из которых является новым экземпляром моего объекта, используя Object.create, все мои переменные имеют свои собственные строковые свойства, но все они совместно используют один и тот же массив!Если вы запустите приведенный ниже код шаг за шагом, то при каждом воздействии на массив вы увидите, что все массивы предыдущей переменной также редактируются !!!(но свойство строки в порядке).Действительно, мы можем видеть, что массивы во всех переменных на самом деле являются одним и тем же массивом благодаря ObjectId отладчика ... Знаете ли вы, как сделать каждый массив специфичным для каждой переменной и не иметь всех переменных, совместно использующих один и тот же объект??

function myFunction() {
  // Object definition
  var my_object = Object.create(null, {
    my_object_name:  {value: new String(), enumerable: true, writable: true},
    my_object_array: {value: new Array(),  enumerable: true, writable: true},           
    build: {
      value: function (i) {         
        this.my_object_name = "name_" + i.toString();           
        for (var j = 0; j <= 4; j++) {
          this.my_object_array[j] = i + j;
        }
        return this;         
      }
    }
  });

  // Main    
  var my_variable_1 = Object.create(my_object).build(1);
  var my_variable_2 = Object.create(my_object).build(5);
  var my_variable_3 = Object.create(my_object).build(10);
}

В конце мы получим приведенный ниже результат со всеми различными строками для свойства my_object_name, но с одинаковыми массивами для свойства my_object_array

my_variable_1.name = "name_1" / my_variable_1.array = [10, 11, 12, 13, 14]
my_variable_2.name = "name_2" / my_variable_1.array = [10, 11, 12, 13, 14]
my_variable_3.name = "name_3" / my_variable_1.array = [10, 11, 12, 13, 14]

Но я бы хотел найти:

my_variable_1.name = "name_1" / my_variable_1.array = [ 1,  2,  3,  4,  5]
my_variable_2.name = "name_2" / my_variable_1.array = [ 5,  6,  7,  8,  9]
my_variable_3.name = "name_3" / my_variable_1.array = [10, 11, 12, 13, 14]

1 Ответ

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

Ваш my_object_array находится на прототипе, и каждый доступ ведет к одному и тому же массиву через цепочку прототипов.Разные свойства должны сидеть на самих объектах.Попробуйте это -

// constructor
function MyObject(i) {
  this.name = 'name_' + i; // own
  this.array = this.build(i); // own
}

// on prototype = shared
MyObject.prototype.build = function(i) {
  var arr = [];
  for (var j = 0; j <= 4; j++) {
    arr[j] = i + j;
  }
  return arr;
};

// Main
var my_variable_1 = new MyObject(1);
var my_variable_2 = new MyObject(5);
var my_variable_3 = new MyObject(10);

console.log(my_variable_1.array);
console.log(my_variable_2.array);
console.log(my_variable_3.array);

// [ 1, 2, 3, 4, 5 ]
// [ 5, 6, 7, 8, 9 ]
// [ 10, 11, 12, 13, 14 ]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...