javascript, инициализирующий атрибуты объекта? - PullRequest
0 голосов
/ 25 июня 2011

Я пытаюсь написать оболочку для массива, и у меня есть следующий код:

myList = function () { };
myList.prototype.innerArray = [];
myList.prototype.add = function(pt) { this.innerArray.push (pt); return this; };

Для каждого объекта myList, который я создаю, я надеюсь получить пустой атрибут innerArray.Но я боюсь, что я еще не совсем понял концепцию прототипов, потому что:

m = new myList().add(4).add(5); 
m.innerArray.length;

возвращает 2, пока все хорошо, но теперь я делаю:

j = new myList();
j.innerArray.length;

который также возвращает 2, и я бы ожидал 0 (свежий новый innerArray);Боюсь, я упускаю что-то фундаментальное.

Ответы [ 3 ]

2 голосов
/ 25 июня 2011

Вы не хотите использовать прототип с innerArray. В вашем конструкторе просто сделайте this.innerArray = [] и теперь у вас есть переменная экземпляра. Используя прототип, вы создаете атрибут класса (например, общий для экземпляров класса), а не переменную экземпляра (например, уникальную для экземпляра класса).

1 голос
/ 25 июня 2011

Все экземпляры myList совместно используют один и тот же объект-прототип.Он не копируется и не клонируется для каждого экземпляра.Для функций это хорошо, потому что когда вы вызываете foo.add(), тогда this является экземпляром, позволяя вам извлекать значения для каждого экземпляра.foo.add и bar.add являются одним и тем же функциональным объектом, но this отличается в каждом вызове.Но когда значения изменяются непосредственно в прототипе, они изменяются для всех экземпляров, поскольку все они указывают на одни и те же объекты.

Вместо этого вы хотите создать новый массив в конструкторе:

myList = function () {
  this.innerArray = [];
};
myList.prototype.add = function(pt) {
  this.innerArray.push (pt);
  return this;
};
1 голос
/ 25 июня 2011

Вы должны сделать

myList = function () { this.innerArray = []; };

следующим образом:

myList.prototype.innerArray = [];

создает innerArray переменную, общую для всех экземпляров.

...