Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/399.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 扩展一个对象,不管它是否存在?_Javascript_Jquery - Fatal编程技术网

Javascript 扩展一个对象,不管它是否存在?

Javascript 扩展一个对象,不管它是否存在?,javascript,jquery,Javascript,Jquery,问题 我在不可依赖的不同位置声明父对象的某些属性,因此在声明这些属性时很难预测父对象是否仍然存在。无论这种情况发生在何处,如果父对象还不存在,我需要创建它,但如果它存在,则不需要重新声明 示例 假设我在某个地方发生了这样的JavaScript: membership = { id: 5, name: "John" } 在代码中的另一点(可能在上述代码块之前或之后),我有如下内容: membership.level = "gold"; 我基本上需要能够拥有成员资格。level创

问题

我在不可依赖的不同位置声明父对象的某些属性,因此在声明这些属性时很难预测父对象是否仍然存在。无论这种情况发生在何处,如果父对象还不存在,我需要创建它,但如果它存在,则不需要重新声明

示例

假设我在某个地方发生了这样的JavaScript:

membership = {
    id: 5,
    name: "John"
}
在代码中的另一点(可能在上述代码块之前或之后),我有如下内容:

membership.level = "gold";
我基本上需要能够拥有
成员资格。level
创建
成员资格
对象(如果它还不存在),但是如果它确实存在,只需添加
level
属性即可。类似地,第一个代码块需要以这样一种方式工作:如果
成员资格
已经存在,它只需添加
id
名称
属性

我目前掌握的代码

我的解决方案不起作用,但我想你会明白我的意图。这就是我所尝试的:

第一街区

第二街区

当未定义成员资格时,上述错误有时仍然存在。有没有一种方法可以像我描述的那样做到这一点?提前谢谢

var membership = $.extend({}, membership , {
    level: "gold"
});
jsiddle:

试试这个:

membership = $.extend(membership || {} , {
    level: "gold"
});
如果成员身份未定义,它将创建一个对象

通常使用
|
运算符完成此操作

var membership = membership || { id: 5, name: "John" };
基本上,如果未定义
成员资格
,则成员资格设置为与对象定义相等,但如果定义了
成员资格
,则仅重新分配

如果您愿意,您可以使用extend call来完成此操作

//this could be used as the extend membership
var membership = membership || { id: 5, name: "John" };
membership = $.extend(membership , {
 level: "gold"
});//this could also be membership.level = "gold";

这样做感觉很糟糕。始终使用
var foo=…
声明变量,以便稍后返回代码并了解发生了什么。另外,JavaScript中隐式声明的全局变量会导致癌症(或者至少是头痛),这并不理想,但在这种情况下是必要的。
var membership = membership || { id: 5, name: "John" };
//this could be used as the extend membership
var membership = membership || { id: 5, name: "John" };
membership = $.extend(membership , {
 level: "gold"
});//this could also be membership.level = "gold";