对象合并函数从《权威指南》到JavaScript,其作用与扩展函数完全相同?

对象合并函数从《权威指南》到JavaScript,其作用与扩展函数完全相同?,javascript,function,object,utility,Javascript,Function,Object,Utility,我在《JavaScript权威指南》中的“对象”一章,我正在讨论Flanagan共享的一些对象实用程序函数 这两个函数是extend()和merge()函数: /* Copy enumerable props of p to o, and return o. */ /* Same name props, o is overwritten */ function extend(o, p) { for (prop in p) { o[prop] = p[prop]; } ret

我在《JavaScript权威指南》中的“对象”一章,我正在讨论Flanagan共享的一些对象实用程序函数

这两个函数是extend()和merge()函数:

/* Copy enumerable props of p to o, and return o. */
/* Same name props, o is overwritten */

function extend(o, p) {
  for (prop in p) {
    o[prop] = p[prop];
  }
  return o;
}

/* Copy the enumerable props of p to o, and return o.
/* Same name props, o's property is left alone. */

function merge(o, p) {
  for(prop in p) {
    if (o.hasOwnProperty[prop]) continue;
    o[prop] = p[prop];
  }
  return o;
}
为了查看不同功能的效果,我尝试:

var x = {
  a: 1,
};
var y = {
  a: 4,
  b: 5,
  c: 6
};

merge(x, y);
它返回x作为对象{a=4,b=5,c=6}。我认为x的匹配属性不应该被覆盖。我也试过了

extend(x, y);
返回x作为对象{a=4,b=5,c=6}


有人知道为什么这些函数的行为是相同的吗?我已经查看了堆栈溢出一段时间,但找不到任何具体解决此行为的方法。

您在
merge
中有一个输入错误,应该是
o.hasOwnProperty(prop)
(括号而不是括号):


我只是在玩它,看不见它-很好的发现:)@go oleg非常感谢,它修好了!我想我是因为关注细节而不是批判性思维而得到分数的——这就是书中的写法
function merge(o, p) {
  for(prop in p) {
    if (o.hasOwnProperty(prop)) continue;
    o[prop] = p[prop];
  }
  return o;
}