刚才有一个简短的问题,为什么某个分配顺序有效,而另一个则没有。
我想创建一个简单的“继承”/“复制”功能(仅用于测试),它将属性从一个对象复制到另一个对象:
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);
答案 0 :(得分:1)
您正在循环obj1
的所有属性,因此obj1
上存在所有这些属性。
如果您尝试从obj2
复制,那么您正在尝试复制不存在的属性(在该对象上),因此会导致错误。
答案 1 :(得分:1)
您正在阅读属性var p in obj1
,因此这些索引只能存在于obj1
中。因此,尝试分配obj1[p] = obj2[p];
将无法按预期工作,因为无法保证(在您的特定示例中肯定是这种情况)obj[p]
已定义。此分配只会将undefined
分配给obj1
中obj2
中不存在的obj2
中的索引,并复制其{{1}}中存在索引的值。
你需要分别遍历每个对象的属性(即两个循环),虽然这也不是一个好主意,因为在两个对象上具有相同索引的任何值都将导致一个被擦除。你到底想要实现什么目标?这似乎是一件非常危险/不稳定的事情。