JS对象中属性的赋值顺序

时间:2011-06-29 14:22:23

标签: javascript properties javascript-objects

刚才有一个简短的问题,为什么某个分配顺序有效,而另一个则没有。

我想创建一个简单的“继承”/“复制”功能(仅用于测试),它将属性从一个对象复制到另一个对象:

var cat = { tail:"yes", hairy:"yes, hairy" };
var dog = { sick:"extremely ill"};

function inherit(obj1, obj2) {
    for (var p in obj1) 
    {
    obj2[p] = obj1[p]; // this works, but "obj1[p] = obj2[p];" doesn't. Why??
    }
}

inherit(cat, dog);

console.log(dog.tail);

2 个答案:

答案 0 :(得分:1)

您正在循环obj1的所有属性,因此obj1上存在所有这些属性。

如果您尝试从obj2复制,那么您正在尝试复制不存在的属性(在该对象上),因此会导致错误。

答案 1 :(得分:1)

您正在阅读属性var p in obj1,因此这些索引只能存在于obj1中。因此,尝试分配obj1[p] = obj2[p];将无法按预期工作,因为无法保证(在您的特定示例中肯定是这种情况)obj[p]已定义。此分配只会将undefined分配给obj1obj2中不存在的obj2中的索引,并复制其{{1}}中存在索引的值。

你需要分别遍历每个对象的属性(即两个循环),虽然这也不是一个好主意,因为在两个对象上具有相同索引的任何值都将导致一个被擦除。你到底想要实现什么目标?这似乎是一件非常危险/不稳定的事情。