2013-02-21 15 views
1

如何從現有JS對象

var a = { 
    f1: function() { 
     // Do Something 
    }, 
    f2: ['a','b','c'], 
    f3: 1234 
} 

我需要創造這樣的事情

var b = Object.create(a); 

但是b實例化一個相同的JS對象沒有顯示我所包含的所有的一個!

+0

'b'''''''因爲它是原型,所以只要你不覆蓋'b'上的同一個屬性,它們將在訪問時在'a'上查找。 – Yoshi 2013-02-21 11:51:44

+0

[在Javascript中複製對象]的完全重複(http://stackoverflow.com/questions/728360/copying-an-object-in-javascript) – Bergi 2013-02-21 11:57:26

+0

對不起,因爲我寫了我的答案,但我有一個小錯誤。檢查一下,因爲現在我已經修復了它,並且寫了一個更好的描述。請注意,這只是JavaScript代碼,這是學習語言高級方面的最佳方式,但是您可以使用jQuery的擴展方法嗎? :) – albertoblaz 2013-02-21 21:51:55

回答

2

您可以創建一個克隆功能,做這樣的事情:

var clone = function(obj) { 

    // Create a new object using the same prototype as the original object 
    var cloned = Object.create(obj);  

    // Copy each property from 'obj' to 'cloned' 
    for (p in obj) {  
     if (obj.hasOwnProperty(p)) { 
      cloned[p] = obj[p]; 
     } 
    } 

    return cloned;  // Return the cloned object 
} 

編輯:小心的第一條語句創建一個從克隆對象原版的。

  1. 你必須注意到,如果你寫var cloned = {};像我以前那樣,原型是不同的,因此該方案將不會在100%正常工作,因爲如果使用instanceof運營商,它將返回false

  2. 如果您僅使用var cloned = Object.create(obj);作爲其他答案描述的內容,您只需獲得一個克隆的對象,其原型與原型的原型相似。但是您還需要複製原始對象的屬性並將它們附加到克隆的版本。這就是我們必須使用for循環的原因。

最後,如果使用的Object.create第二前次做法並不在瀏覽器中工作,因爲它有一個傳統的JavaScript引擎,那麼你必須使用一個小的解決方法如下所示。

function F() {}; 
F.prototype = obj.prototype; 
var cloned = new F(); 

希望它有幫助! :)

0

使用prototype

var b = Object.create(a.prototype); 

Object.create創建具有指定原型對象和屬性的新對象。

,預計原型爲新創建的對象:Object.create(proto [, propertiesObject ])

https://developer.mozilla.org/en-US/docs/JavaScript/Reference/Global_Objects/Object/create

+1

'a'沒有「原型」屬性! – Bergi 2013-02-21 13:14:29

+0

@Darren Davies @Bergi也許你可以使用'a .__ proto__',但我認爲這是一個非標準的屬性。甚至,我試着在我的控制檯上,但它不適合我:( – albertoblaz 2013-02-21 21:27:54

+0

@albertoblaz:不,絕對不是。'Object.create(a .__ proto __)'將等於'var b = {};'。 – Bergi 2013-02-21 21:33:26

0

另一種方式來做到這一點,使用jQuery是功能Jquery.extend。您可以使用它像這樣:

var b = jQuery.extend({},a); 
+0

您可以插入多個對象並通過其屬性的聯合來創建複合複雜對象 – 2013-02-21 11:54:24