jQuery $.extend() - 如果新成员不存在,如何不向第一个对象添加新成员?

发布于 2024-09-11 13:08:11 字数 770 浏览 5 评论 0原文

我刚刚在使用 jQuery 扩展 javascript 对象时偶然发现了一个小问题。执行时,

var item = $.extend(options.itemDefaults, item);

options.itemDefaults 会使用 item 中已有的属性进行扩展,并将结果传递给 item。到目前为止,一切都很好。

但下一次执行此行时,options.itemDefaults 将具有 item 具有的所有属性值,而不是原始默认值。我的默认值丢失了!

我意识到我可以简单地将默认对象存储在临时变量中,然后扩展临时变量,但这似乎有点冗长。有没有一种方法可以做我想做的事情(用提供的值覆盖默认值,在没有提供值时采用默认值,但不更改默认对象)而不需要绕道?

更新:看来这并不像我希望的那么容易解决。当我

var defaults = options.itemDefaults;
var $item = $.extend(defaults, { attributeModel: options.attributeModel }, item);
defaults = undefined 

在每次迭代中执行此操作时,我仍然会在 options.itemDefaults 上添加来自 item 的属性!我该如何解决这个问题?

I just stumbled over a small problem when extending javascript objects using jQuery. When executing

var item = $.extend(options.itemDefaults, item);

options.itemDefaults is extended with the properties that are already in item and the result is passed to item. So far, so good.

But the next time this line is executed, options.itemDefaults has all the property values that item had, instead of the original defaults. My defaults are lost!

I realize I could simply store the defaults object in a temporary variable, and extend the temporary variable instead, but it seems a bit lengthy. Is there a way to do what I'm after (overriding default values with supplied ones, taking defaults when no values are supplied, but not changing the default object) without that detour?

Update: It seems this wasn't as easy to get around as I hoped. When I do

var defaults = options.itemDefaults;
var $item = $.extend(defaults, { attributeModel: options.attributeModel }, item);
defaults = undefined 

in each iteration, I still add properties from item on options.itemDefaults! How do I get around this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

夜还是长夜 2024-09-18 13:08:11

尝试一下,

var item = $.extend(true, {}, options.itemDefaults, item);

true 标志表示 必须进行深层复制

我们使用空对象 {} 作为目标,因此默认值不会被篡改。

options.itemDefaultsitem 的属性将被复制到空对象中。

Try,

var item = $.extend(true, {}, options.itemDefaults, item);

The true flag indicates that a deep copy must be made.

We use an empty object {} as the target so the defaults are not tampered with.

Properties of options.itemDefaults, and item will be copied into the empty object.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文