Javascript, jQuery.extend и «новый» - PullRequest
       7

Javascript, jQuery.extend и «новый»

1 голос
/ 16 февраля 2011

У меня странное поведение при расширении прототипа объекта с использованием jQuery.extend.

Предполагая, что этот пример класса:

var SampleClass = function (anArray) { this.Init(anArray); };

$.extend(SampleClass.prototype, {

    array: null,
    collection: new Array(),

    Init: function (arr) {
        var c = this;
        c.array = arr;
        c.insertInCollection();
    },

    insertInCollection: function () {

        var c = this;
        var l = c.array.length;
        for (var i = 0; i < l; i++) {
            var bar = {};
            c.collection.push(bar);
        }

        alert(c.collection.length);
    }
});

Затем я выполняю этот пример кода

var arr1 = [{ name: 'foo', value: 20 }, { name: 'baz', value: 20}];
var arr2 = [{ name: 'bar', value: 60 }, { name: 'gaz', value: 40}];

c = new SampleClass(arr1);
d = new SampleClass(arr2); //<-- HERE LIES THE PROBLEM

Когда я создаю объект "c", коллекция заполняется внутри функции "insertInCollection", а предупреждение возвращает длину 2. Однако когда я создаю экземпляр объекта «d» (выполняю новый TestClass (arr2)), срабатывает предупреждение внутри функции «insertInCollection», и предупреждение показывает 4!

На практике я не могу понять, что происходит в фоновом режиме. Похоже, что элементы первой коллекции никогда не удаляются - когда создается второй объект ("d"), в нем уже есть 2 элемента объекта "c", существующих внутри свойства "collection".

Это также происходит без использования jQuery.extend, с использованием простого подхода .prototype.

Кто-нибудь может мне помочь с этим?

Заранее спасибо!

1 Ответ

3 голосов
/ 16 февраля 2011

Это происходит потому, что каждый «экземпляр» SampleClass совместно использует одно свойство collection: когда метод insertInCollection() обращается к свойству collection объекта, ни один объект не найден в самом объекте, поэтому он использует collection свойство прототипа объекта. Чтобы это исправить, вам нужно создать новый массив collection для каждого объекта SampleClass. Метод Init() был бы хорошим местом для этого:

Init: function (arr) {
    var c = this;
    c.collection = [];
    c.array = arr;
    c.insertInCollection();
},
...