2011-08-11 41 views
2
/* 
* Copy the enumerable properties of p to o, and return o. 
* If o and p have a property by the same name, o's property is overwritten. 
* This function does not handle getters and setters or copy attributes. 
*/ 
function extend(o, p) { 
     for(prop in p) { // For all props in p. 
      o[prop] = p[prop]; // Add the property to o. 
     } 
     return o; 
} 



/* 
* Return a new object that holds the properties of both o and p. 
* If o and p have properties by the same name, the values from o are used. 
*/ 
    function union(o,p) { return extend(extend({},o), p); } 

我认为联盟,他的意思是“使用p的值”。权威指南(6ed)错误?

我在Chrome上做了测试。我错了吗?抱歉。当我学习时,我倾向于非常小心,特别是这是Javascript的第一本书,6ed最近。

变种O = {X:1}

变种P = {X:2}

功能扩展(邻,对){

for(prop in p) 
    o[prop] = p[prop]; 
return o; 

}

功能联盟(o,p){

return extend(extend({},o),p); 

变种克=联盟(邻,对)

g.x

谢谢。

+2

你是对的... – sje397

+1

你可以在这里提交勘误表:http://oreilly.com/catalog/errata.csp?isbn=9780596805531 –

回答

3

是的,它应该从p读取属性保留,o被覆盖。

虽然编写这些代码时,它是更安全一点要做到这一点:

for(var prop in obj) { 
    if(obj.hasOwnProperty(prop)) { 
     // now you know it is actually a property on obj and not inherited from elsewhere 
    } 
} 
1

Flannigan的书被认为是在JavaScript中的“least bad”的书,所以请谨慎使用。例如,在延长函数变量道具未声明及以下:

for(prop in p) { // For all props in p. 
    o[prop] = p[prop]; 
} 

真的应该包括hasOwnProperty测试,否则将复制继承枚举的属性也:

for (var prop in p) { 
    if (p.hasOwnProperty(prop)) { 
     o[prop] = p[prop]; 
    } 
} 

是的,术语“联合”是probaby误导任何谁试图严格应用集合论的对象。如果Ø已经有p具有相同的名称作为一个属性,那么它将被分配在p(有效覆盖一个价值上Ø)相同的值之一。

我想他正试图展现Ø现有的性质不会对p等效不会更改或删除。