Javascript 当移动到函数中时,JQuery extend显示为断开

Javascript 当移动到函数中时,JQuery extend显示为断开,javascript,jquery,Javascript,Jquery,问题:如何在不创建新对象引用的情况下“就地”扩展对象 简介:jQueryExtend执行它在tin上所说的操作 但是如果使用返回新对象的jquery.extend版本,那么新对象就是一个新对象。这一切都很好,但是如果我在一个函数中进行扩展,我将引用传递给要扩展的对象,那么原始对象将保持不变。一个很好的陷阱等着粗心的人(我)。你知道物体是-对吗 示例代码:假设我有一个对象 myObject = { fontFamily : 'Tahoma', fontSize: '12',

问题:如何在不创建新对象引用的情况下“就地”扩展对象

简介:jQueryExtend执行它在tin上所说的操作

但是如果使用返回新对象的jquery.extend版本,那么新对象就是一个新对象。这一切都很好,但是如果我在一个函数中进行扩展,我将引用传递给要扩展的对象,那么原始对象将保持不变。一个很好的陷阱等着粗心的人(我)。你知道物体是-对吗

示例代码:假设我有一个对象

myObject = {
    fontFamily : 'Tahoma',
    fontSize: '12',
    color : '000000'
}
和默认选项

myDefaults = {
    fontFamily : 'Tahoma',
    fontSize: '15',
    color : 'FF0000',
    weight : 'bold',
    decoration : 'underline'
}
我的预期结果是:

myObject = {
    fontFamily : 'Tahoma',
    fontSize: '12',
    color : '000000',
    weight : 'bold',
    decoration : 'underline'
}
下面是代码:

var myObject={
fontFamily:“塔荷马”,
字体大小:“12”,
颜色:“000000”
}
$('#myObjectIn').html(JSON.stringify(myObject));
肌体(myObject);
$('#myObjectOut').html(JSON.stringify(myObject));
功能扩展器OONY(obj){
var myDefaults={
fontFamily:“塔荷马”,
字体大小:“15”,
颜色:“FF0000”,
重量:'粗体',
装饰:“下划线”
}

obj=$.extend({},obj,myDefaults);//这是我的答案-与问题相同的基本代码片段,添加了注释

var myObject={
fontFamily:“塔荷马”,
字体大小:“12”,
颜色:“000000”
}
$('#myObjectIn').html(JSON.stringify(myObject));
//尝试#1
//myObject=extenderoony(myObject);//我想这会失败,因为param引用覆盖了返回的值
//尝试2
var a=extenderoony(myObject);//引入额外的变量以接收对象引用
myObject=a;//并将此引用传递给原始的.Phew,hacky。
$('#myObjectOut').html(JSON.stringify(myObject));
功能扩展器OONY(obj){
var myDefaults={
fontFamily:“塔荷马”,
字体大小:“15”,
颜色:“FF0000”,
重量:'粗体',
装饰:“下划线”
}

obj=$.extend({},obj,myDefaults);//将选项扩展到默认值会使myDefaults接受您显式提供的值。然后将myDefaults扩展到选项会使您更新传入的原始对象,而不是将其分配给一个全新的对象

var myObject={
fontFamily:“塔荷马”,
字体大小:“12”,
颜色:“000000”
};
功能扩展(选项){
设myDefaults={
fontFamily:“塔荷马”,
字体大小:“15”,
颜色:“FF0000”,
重量:'粗体',
装饰:“下划线”
}
让temp=$.extend(myDefaults,options);
$.extend(选项,我的默认值);
}
扩展(myObject);
让expectedObject={
丰特家族:“塔荷马”
,字体大小:'12'
,颜色:“000000”
,重量:'bold'
,装饰:“下划线”
};
key(expectedObject.forEach)(key=>{
log(`Dos${key}与预期值匹配吗?`,myObject[key]==expectedObject[key]);
});

我的意思是,是吗?
obj
有一个对内存中对象的引用值。如果您使用该引用,请转到内存中的对象位置,并在内存中更改该对象,这反映在方法之外。但是,如果您更改obj引用的对象,它当然不会引用选择原始对象。你不再指向它。谢谢Taplar。这是我的观点。我正在寻找一个就地版本,它可以在不丢失原始引用的情况下实现默认值与目标对象的合并。我不确定你所要求的是否有就地版本,它本质上要求的是
$.extend(obj,myDefaults)
仅从我的默认值复制键值,如果它在obj alreadyerr中不存在,是的,这就是它的工作原理。只修改传递给$.extend的最左边的对象。(第一个,在本例中是在函数中创建的新对象。)
obj=
更改
obj
的值,但它不会修改您以前存储在其中的对象。谢谢Kev。这是我的一个问题-如何在不需要任何额外变量的情况下实现与“plcae”中的默认对象的合并。从函数返回您想要的对象,并将其存储在您想要的变量中把它放在外面。不需要额外的变量。感谢代码片段Taplar。这里似乎有一个新的变量'temp',所以它不是一个很合适的解决方案?而且它需要双重使用extends。现在任何时候,一些纯粹主义者都会加上一条评论,说执行需要两倍的cpu周期。对于我的猫ion,当你说
in-place
时,你是指jQuery中预先存在的方法,还是指单个操作?单个操作。因此,将目标对象的属性与默认对象合并,但保留目标中的任何值。在单个操作中,不丢失从对象变量到我中原始对象的链接mory.理想情况下没有其他LIB-我猜下划线可以做到,等等,但我想保留对vanilla JS和JQ的依赖关系。添加了一个二级代码段,循环默认键,并且仅在未定义的情况下将它们复制到原始对象。将您的答案标记为正确。这并不完美,因为它比简单的JQ扩展更复杂,不过,对于正在发生的事情,这一点更为明显,也更具指示性。感谢您的及时回复。我被困在ES5中,但可以转换您的代码。