2016-12-31 144 views
0

我有這樣的對象:如何創建從父對象繼承的對象?

var A = { 
    headers: { 
    'a property' : 'a value' 
    } 
}; 

我如何創建這樣另一個對象?

我不想鍵入整個父對象?我的新對象應該包含父對象,所以當我的變量A,B和C應該產生不同的結果。

var B = { 
    headers: { 
    'a property' : 'a value', 
    'b property' : 'b value' 
    } 
}; 

var C = { 
    headers: { 
    'a property' : 'a value', 
    'b property' : 'b value' 
    }, 
    other: { 
    other2: { 
     'other2 property' : 'other2 property' 
    } 
    } 
}; 
+0

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

+0

@Teemu有點混淆如何使用它,可能是你可以回答它。 –

+0

如果在擴展它時需要對上一個對象進行深度克隆,則可以使用針對[此問題]發佈的許多深度合併解決方案之一(http://stackoverflow.com/questions/171251/how-can-i -merge-properties-of-two-javascript-objects-dynamically/41407737#41407737),例如函數I [posted on](http://stackoverflow.com/a/41407737/5459839)。 – trincot

回答

0

如果您的問題與值已經擴展對象BA,您可以使用JavaScript對象的方法Object.assign做象下面這樣:

var A = { 
    headers: { 
    'a property' : 'a value' 
    } 
}; 


var B = Object.assign(A); 
B.headers['b property'] = 'b value'; 

這將複製的內容來源這裏對象即A.headersB.headers導致如下:

{ 
    headers: { 
    'a property' : 'a value', 
    'b property' : 'b value' 
    } 
}; 
+0

請注意此代碼如何將'b屬性'添加到'A.headers' – trincot

2

您可以ü se創建功能:

var B = Object.create(A); 
B.headers['b property'] = 'b value'; 

var C = Object.create(B); 
C.others = { 
    other2: { 
     'other2 property' : 'other2 property' 
    } 
    } 
+0

應該是'var C = Object.create(B)'no? –

+0

是的,謝謝你的評論。 – Saeed

+0

請注意,B和C與A共享'headers'對象。如果您通過一個來更改它們,則更改也會在另一箇中可見。注意這段代碼如何將'b property'添加到'A.headers'。 – trincot

0

我總是在我的項目中使用Simple JavaScript Inheritance by John Resig。這是繼承的簡單而優雅的解決方案。

通過使用上述解決方案,您可以按如下方式定義您的類。你所需要做的就是擴展這些類。

var Person = Class.extend({ 
    init: function(isDancing) { 
     this.dancing = isDancing; 
    } 
}); 

var Ninja = Person.extend({ 
    init: function() { 
     this._super(false); // => Overrides the superior constructor 
    } 
}); 

var p = new Person(true); 
p.dancing; // => true 

var n = new Ninja(); 
n.dancing; // => false 

這也有因爲將是您的所有類的init方法,所以你要知道哪裏來引導的事情,以及如何覆蓋事情正確。