【问题标题】:Object Not Being Passed as Reference对象未作为参考传递
【发布时间】:2010-11-13 08:58:21
【问题描述】:

我有一个 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;
}

编辑:

抱歉,我想我想这样做已经很清楚了。 ObjectManger 没有什么特别之处。它只是为我的每个对象提供了一个属性和 Get 方法。为简单起见,我只包括了 fieldsets 属性和 Getter。我希望这能澄清我的意图。

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

编辑2:

经过一些测试,我发现了一些奇怪的东西......希望有人可以向我解释为什么会发生这种情况。

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

【问题讨论】:

  • 您没有说明您希望这段代码做什么,也没有说明它实际在做什么。请澄清。
  • 问题中缺少 ObjectManager
  • 您的编辑并没有很好地解决问题。目前还不清楚代码实际做了什么以及你期望它做什么。不要让我们猜测。
  • “问题在于 ObjectManager 没有引用已创建的对象,而是似乎正在创建它的新实例。”我认为这很清楚。我正在给你写回复,但决定先做一些测试,这导致了更多细节。我会更新问题。给我一点时间。
  • 不清楚,因为您没有向我们展示任何代码(a)实际上向管理器添加了一个字段集,只是一个这样做的函数,但没有显示该函数的调用方式,也没有(b ) 尝试从管理器中检索该字段集的代码,以及它返回的对象而不是您期望的对象。

标签: javascript object reference


【解决方案1】:

在 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

【讨论】:

  • 问题是它们不是同一个对象。记录是为了表明它们不是同一个对象。
【解决方案2】:

嗯,您的 Fieldset 构造函数正在返回一个对象。也许尝试将其称为Fieldset({...}) 而不是new Fieldset({...})

【讨论】:

  • 抱歉,编辑时出错。仍然返回假。 (更新)
  • 另外,单独记录每个数据表明它们包含相同的数据,但它们不是同一个对象。
  • 还是假的。但只是出于好奇,这会有什么不同?
  • new fn() 的语义与fn() 有很大不同。您对该函数的定义表明您应该在没有new 的情况下调用它。
  • 我刚刚测试了一些可能有用的信息....调用 log(ObjectManager.GetFieldset(fieldset.id) == fieldset);就在返回字段集之前;构造函数的计算结果为 true....
【解决方案3】:

我假设您的 Form 类看起来像您的 Fieldset 类,即它$.extends(制作深层副本)您为其提供的选项及其内部“原型”。返回的对象是扩展原型,而不是使用原型对象扩展的options。尝试更改 $.extend 参数的顺序(将选项放在第二位,将内部“原型”放在第三位),看看是否有任何改变。或者,发布您的表单类:-)

【讨论】:

  • 对 jQuery 扩展功能有一点误解,所以我更新了我的答案。抱歉,如果这听起来非常令人困惑 - 简而言之,如果您的 Form 类以 var form = ($.extend(true, { lotsOfStuff }, options); 开头,请尝试交换 { lotsOfStuff }options
  • 嗯,那我也不知道。不过,我仍然认为您还需要发布您的 Form 课程。我们不知道您的 Form 构造函数对传递给它的字段集做了什么(我仍然打赌它会进行一些复制;))
猜你喜欢
  • 2013-05-28
  • 2018-10-16
  • 2011-12-15
  • 2016-04-11
  • 2014-02-10
  • 1970-01-01
  • 2019-12-28
  • 2014-03-05
  • 1970-01-01
相关资源
最近更新 更多