【问题标题】:can't copy object properties to another in javascript无法在javascript中将对象属性复制到另一个
【发布时间】:2012-12-08 10:17:12
【问题描述】:

这应该很简单,但是我无法将一个对象的属性复制到另一个对象。

var tableFormatting = {
    table: {
        style: {
            width: "100px",
            height: "100px"
        },
        border: "1px"
    }
    //similar code for tbody, tr, td  
};
var table = document.createElement('table');
for (var p in tableFormatting.table)
table[p] = tableFormatting.table[p];
alert(table.style.width); //shows nothing. can't access it  
alert(typeof(table.style.width)); //shows string, so i know it was copied or has a reference
alert(table.border); //shows 1px. this one is copied and accessible 

为什么不显示样式属性?

【问题讨论】:

  • @sємsєм,你用什么语言编程? foreach 不在 JavaScript 中。
  • @epascarello 哦!对不起!我很困惑。

标签: javascript object properties copying


【解决方案1】:

你需要深拷贝它们

function copyValues( dst, src ) {
    for( var key in src ) {
        var value = src[key];
        if( typeof value == "object" ) {
            copyValues( dst[key], value );
        }
        else {
            dst[key] = value;
        }
    }
}

copyValues( table, tableFormatting.table );

http://jsfiddle.net/RpJKH/

否则,发生的事情是手动等效的:

 table.style = obj.style

当然,这没有任何作用,因为.style 是只读的。

【讨论】:

  • 为了安全起见,您可能需要考虑添加value instanceof Array check in 以及src.hasOwnProperty(p)typeof someArray 也返回 object,在这种情况下,someArray.slice(0); 工作得很好(假设它是一个基元数组)
  • @EliasVanOotegem dom 元素的哪些属性表示为数组?我猜是 ClassList,但 .className 涵盖了这一点
  • @Esailija:我只是为了完整性添加了注释,以防有人会使用此代码设置多个类:{className: ['foo', 'bar']},或使用它来实际复制任何对象文字
  • 谢谢我的朋友!!我担心我将不得不进行深度复制。 table.style = obj.style 是只读的,所以 table 不能修改 obj.style?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-22
  • 2017-05-08
  • 2014-12-08
  • 1970-01-01
相关资源
最近更新 更多