2012-12-04 38 views
1

我有一个简单的“扩展”的方法建立这样的多个版本:的Javascript,简单的扩展方法,允许延长对象

extend: function(source) { 
    for (var k in source) { 
     if (source.hasOwnProperty(k)) { 
      myThing[k] = source[k]; 
     } 
    } 
    return myThing; 
} 

您可以使用它像

myThing.extend({ 
    newObj: { 
     myFunc: function() { console.log('things'); } 
    } 
}); 

和它的伟大工程。
不过,我很想加入到有一些其他部分的代码调用稍后的能力:

myThing.extend({ 
     newObj: { 
      mySecondFunc: function() { console.log('things'); } 
     } 
    }); 

,我应该能够调用都myThing.newObj.myFunc()myThing.newObj.mySecondFunc()

我试图将其更改为这样:

for (var k in source) { 
      if (source.hasOwnProperty(k)) { 
       if (mtUtils.hasOwnProperty(k)) { 
        for (var t in k) { 
         mtUtils[k][t] = source[k][t]; 
        } 
       } else { 
        mtUtils[k] = source[k]; 
       } 
      } 
     } 

,但似乎并没有工作。

+0

我建议在寻找道格拉斯克罗克福德实施了不同的模式。 http://javascript.crockford.com/ –

+0

@AaronKurtzhals:哪一部分?你只是把我送到整个网站。 –

+0

我建议http://javascript.crockford.com/prototypal.html –

回答

1

这应该解决您的问题,但为什么不实施递归版本extend

for (var k in source) { 
     if (source.hasOwnProperty(k)) { 
      if (mtUtils.hasOwnProperty(k)) { 
       for (var t in source[k]) { 
        mtUtils[k][t] = source[k][t]; 
       } 
      } else { 
       mtUtils[k] = source[k]; 
      } 
     } 
    } 
+0

这不正是我发布的,我尝试过,但它没有工作?它应该工作,但没有,所以也许我只需要清除缓存或什么。无论哪种方式,我已经实现了一个递归版本,就像你所建议的一样。 –

+0

@ JamesP.Wright我相信你在代码中拼错了'(源代码[k]中的变量)'',我纠正了这个错误。所以它不完全是你发布的内容。 – xiaoyi

+0

我现在看到了区别。 –

2
function extend(dest, source) { 
    for (var k in source) { 
     if (source.hasOwnProperty(k)) { 
      var value = source[k]; 
      if (dest.hasOwnProperty(k) && typeof dest[k] === "object" && typeof value === "object") { 
       extend(dest[k], value); 
      } else { 
       dest[k] = value; 
      } 
     } 
    } 
    return dest; 
} 
var myThing = {}; 
extend(myThing, { 
    newObj: { 
     myFunc: function() { 
      console.log('things'); 
     } 
    } 
}); 
extend(myThing, { 
    newObj: { 
     mySecondFunc: function() { 
      console.log('things'); 
     } 
    } 
}); 

myThing; 
/* 
Object 
    newObj: Object 
     myFunc: function() { console.log('things'); } 
     mySecondFunc: function() { console.log('things'); } 
     __proto__: Object 
    __proto__: Object 
*/