2015-10-14 106 views
-1

我想將一個普通的JavaScript對象轉換爲具有原型等的對象,而不克隆該對象。這可能嗎?構造函數在不復制對象的情況下獲取對象

本質,而不是這樣的:

var MyClass = function(fromObj) { 
    this.propA = fromObj.propA; 
    this.propB = fromObj.propB; 
    ... 
} 
inherit (SuperClass, MyClass); 

我想:

var MyClass = function(fromObj) { 
    this = fromObj; 
} 
inherit (SuperClass, MyClass); 

要格外清晰:我想將對象從構造函數返回的是,這是同一個對象傳入(不是重複的,不是克隆)。

有沒有辦法做到這一點?或者更好的方式來描述我所要求的? :)

我想這有兩個原因:

  1. 我們加載大量的對象,以及速度和內存可能開始無所謂。
  2. 有很多地方使用「普通的舊javascript對象」,並且可能很難確定它們都指向新的實例化對象。
+0

你是什麼意思,「沒有重複」?執行函數後,您是否想要影響其他對象?克隆用於描述一個新的實例。 – PHPglue

+1

通過引用傳遞一個對象? http://stackoverflow.com/questions/13104494/does-javascript-pass-by-reference –

+0

澄清,@ PHPglue - 沒有重複。我確實希望它影響其他(好,相同)對象。 –

回答

1

我想你想這樣做,以便JSON.parse創建的對象是Object以外的其他實例的實例。

一種選擇是使用Object.setPrototypeOf指定來自指定構造函數的新[[Prototype]],但有performance warnings for this on MDN(我不知道有關權利要求的有效性)。

更有效的解決方案可能是創建「包裝器」對象,並將由JSON創建的對象附加爲屬性。這種方法被許多DOM庫所使用,並且避免了JSON數據中的屬性名稱與對象的方法名稱衝突的可能性(例如,DOM庫可以使用與DOM方法具有相同名稱和特性的方法,但不能覆蓋或與他們發生衝突)。

數據可以保存在閉包中,只有構造函數定義的getter和setter才能訪問它。