मैं एक्मास्क्रिप्ट 5 spec में ऑब्जेक्ट.क्रेट के साथ खेल रहा हूं, और मैं एकाधिक विरासत प्रकार की संरचना बनाने की कोशिश कर रहा हूं।ऑब्जेक्ट.क्रेट बनाम प्रत्यक्ष प्रोटोटाइपल विरासत
कहें कि मेरे पास कुछ कार्य हैं: ए, बी, और सी। केवल प्रोटोटाइप के साथ काम कर के साथ, मैं यह कर सकता हूँ:
function a() {}
a.prototype = {
fnA = function() {},
propA = 500
};
var b = Object.create(new a());
b.fnB = function() {};
b.propB = 300;
var c = Object.create(b);
c.fnC = function() {};
c.propC = 200;
मुझे लगता है कि मैं एक ही परिणाम दोनों तरीकों से मिलती है:
function a() {}
a.prototype = {
fnA = function() {},
propA = 500
};
function b() {}
b.prototype = a.prototype;
b.prototype.fnB = function() {};
b.prototype.propB = 300;
function c() {}
c.prototype = b.prototype;
c.prototype.fnC = function() {};
c.prototype.propC = 200;
लेकिन Object.create का उपयोग कर, मैं कुछ ऐसा कर होगा।
यह थोड़े घबराहट लगता है, क्योंकि मैं एक कन्स्ट्रक्टर फ़ंक्शन के बजाय ऑब्जेक्ट पर वापस आ जाता हूं। ऐसा लगता है कि नियमित प्रोटोटाइपल विरासत करना कम घुसपैठ कर रहा है और मॉड्यूलर अनुप्रयोगों के लिए अधिक समझ में आता है जिन्हें काम करने के लिए किसी विशेष उपचार की आवश्यकता नहीं होती है।
क्या मुझे कुछ याद आ रही है? क्या रचनाकार बनाने के साथ Object.create बनाने की कोशिश करने का कोई फायदा है? या यह मौजूदा वस्तुओं की प्रतिलिपि बनाने के लिए केवल उपयोगी है? मैं प्रोटोटाइप से जुड़े कार्यों & कार्यों तक पहुंच चाहता हूं, और ऑब्जेक्ट में बाद में जोड़े गए कार्यों और गुणों को नहीं।
या इसके बारे में क्या (या बेहतर गहरी प्रतिलिपि का उपयोग करें, लेकिन विचार वही रहता है)?
function A() {}
A.prototype = {
fn: function() {
console.log(this.propA + 30);
},
propA: 20
};
function B() {}
Object.keys(A.prototype).forEach(function (item) {
B.prototype[item] = A.prototype[item];
});
B.prototype.propA = 40;
function C() {}
Object.keys(B.prototype).forEach(function (item) {
C.prototype[item] = B.prototype[item];
});
C.prototype.fn = function() {
console.log(this.propA + 3);
};
var a = new A(),
b = new B(),
c = new C();
a.fn();
b.fn();
c.fn();
ठीक है, मैं ऐसा लगता। लेकिन क्या होगा यदि मैंने सभी गुणों को ए से बी के प्रोटोटाइप में कॉपी किया, तो प्रोटोटाइप में सामान जोड़ा, फिर सी के लिए ऐसा ही किया? क्या यह वही चीज़ प्राप्त करेगा? – tjameson
'ऑब्जेक्ट.क्रेट' का उपयोग करने के लिए बेहतर। तो, 'बी.प्रोटोटाइप = ऑब्जेक्ट.क्रेट (ए.प्रोटोटाइप);' और फिर हम बेहतर समाधान का उपयोग कर कम समाधान को बेहतर बनाते हैं। – jmbucknall
क्या मैं एक और निर्माता बना सकता हूं? मान लें कि मैं Object.create करता हूं, क्या मैं 'नया कार्य कर सकता हूं) (} {} new.prototype = Object.create (बी);' या कुछ समान है? मैं बस एक निर्यात योग्य समारोह चाहता हूँ ... – tjameson