Объект не передается в качестве ссылки - PullRequest
0 голосов
/ 13 ноября 2010

У меня есть ObjectManager, который содержит ссылку на все объекты, которые создаются. Проблема заключается в том, что ObjectManager не ссылается на созданный объект, а вместо этого создает новый его экземпляр. Любая помощь будет оценена. Спасибо!

var Fieldset = function (options) {
    var fieldset = ($.extend(true, {
        id: '',//Let's assume this has been overridden with 'MyFieldset' via the options param.
        title: '',
        accordion: '',
        fields: [],
        hidden: false,
        Show: function () { $('#' + this.id).show() },
        Hide: function () { $('#' + this.id).hide() }
    }, options));

    if (fieldset.id != null && fieldset.id != '')
        ObjectManager.fieldsets[fieldset.id] = fieldset;//Save a reference to this object in the ObjectManager, so I can call ObjectManager.GetFieldset('MyFieldset'). A reference is only saved if an id is provided.

    log(ObjectManager.GetFieldset(fieldset.id) == fieldset);//true
    return fieldset;
}

Edit:

Извините, я думал, что было ясно, что я хотел это сделать. В ObjectManger нет ничего особенного. Он просто имеет свойство и метод Get для каждого из моих объектов. Для простоты я включил только свойство fieldsets и Getter. Надеюсь, это прояснит мои намерения.

var ObjectManager =
{
    fieldsets: {},
    GetFieldset: function (id) { return this.fieldsets[id]; }
};

Edit2:

После некоторого тестирования я обнаружил что-то странное ... Надеюсь, кто-нибудь сможет объяснить мне, почему это происходит.

var myFieldset = new Fieldset({ id: 'MyFieldset' });
log(myFieldset == ObjectManager.GetFieldset('MyFieldset'));//I just found that it is true in this case...
//... However, this is not the normal way I create Fieldsets... This is:
var editForm = new Form({
    dataStore: function () { return ClientsDS; },
    id: 'ClientEditForm',
    fieldSets: [
        new Fieldset({
            id: 'ClientDetailsFieldSet',
            title: 'Details',
            fields: [
            new Field({ id: 'ClientID', name: 'ID', property: 'ID', fieldType: 'hidden', value: '0' })
            ]
        })
    ]
});
log(editForm.fieldSets[0] == ObjectManager.GetFieldset('ClientDetailsFieldSet'));//false

Ответы [ 3 ]

1 голос
/ 13 ноября 2010

В режиме EDIT2:

Ваши объекты не равны, потому что они не одинаковы. Оператор равенства не говорит, что эти два объекта имеют одинаковые пары ключ / значение, они равны, когда они являются одним и тем же объектом.

Например,

var a = b = {a: 1, b:2}; 
//This is b = {a: 1, b: 2}; a = b;  In case you were wondering
a === b //true

var a = {a: 1, b: 2},
    b = {a: 1, b: 2};
a === b //false
0 голосов
/ 13 ноября 2010

Я предполагаю, что ваш класс Form выглядит примерно так же, как ваш класс Fieldset, то есть он $.extends (делает глубокую копию) опций, которые вы предоставляете ему с его внутренним "прототипом".Возвращенный объект - это расширенный прототип, а не options, расширенный с помощью объекта-прототипа.Попробуйте изменить порядок ваших аргументов $ .extend (опциональные параметры put - второй, а внутренний «prototype» - третий) и посмотрите, изменит ли это что-нибудь.Также можно опубликовать свой класс формы: -)

0 голосов
/ 13 ноября 2010

Хм, ваш Fieldset конструктор возвращает объект.Возможно, попробуйте назвать его как Fieldset({...}) вместо new Fieldset({...})?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...