权威指南(6ed)错误?

时间:2011-08-11 01:19:52

标签: javascript

/*
* 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); }

我认为对于 union ,他的意思是“使用p的值”。

我在Chrome上进行了测试。我错了吗?抱歉。我在学习时往往非常谨慎,特别是这是Javascript的第一本书,而6ed是最近的。

  

var o = {x:1}

     

var p = {x:2}

     

function extend(o,p){

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

}

     

function union(o,p){

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

var g = union(o,p)

     

g.x

     

2

谢谢。

2 个答案:

答案 0 :(得分: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 :(得分:1)

Flannigan的书被认为是关于javascript的“least bad”书,所以请谨慎使用。例如,在 extend 函数中,未声明变量 prop 以及以下内容:

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]; 
    }
}

是的,“联盟”一词可能误导任何试图严格应用集合论的对象。如果 o 已具有与 p 上的属性同名的属性,则将为其分配与 p 上的属性相同的值(有效地覆盖 o 上的那个的值。

我认为他试图证明 o o 的现有属性不会更改或删除 p