2012-12-04 34 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 
*/