2013-01-23 20 views
5

मैं समझता हूं कि निजी स्थिर तंत्र जावास्क्रिप्ट में कैसे काम करता है; लेकिन विरासत में वह शिकंजा। उदाहरण के लिए:जावास्क्रिप्ट और विरासत में निजी स्थिर

var Car = (function() { 
    var priv_static_count = 0; 
    return function() { 
     priv_static_count = priv_static_count + 1; 
    } 
})(); 
var SedanCar = function() {}; 
SedanCar.prototype = new Car(); 
SedanCar.prototype.constructor = SedanCar; 

क्या इस पतन से बचने का कोई तरीका है?

+4

"विरासत में शिकंजा" का क्या अर्थ है? आप जिस समस्या को हल करने की कोशिश कर रहे हैं वह क्या है? – jfriend00

+1

नहीं, यह बंद है। – adrian

उत्तर

4

सबसे पहले, जावास्क्रिप्ट में "निजी स्थिर" जैसी कोई चीज़ नहीं है। आप यहां जो भी उपयोग करते हैं वह एक साधारण बंद है, जिसे Immediately-Invoked Function Expression द्वारा बनाया गया है।

आपका प्रश्न बिल्कुल स्पष्ट नहीं है, लेकिन मुझे लगता है कि आप बनाए गए कार उदाहरणों को गिनना चाहते हैं, और यह काम नहीं करता है, क्योंकि जब आप सबक्लास को तुरंत चालू करते हैं तो काउंटर वृद्धि नहीं करेगा (समस्या 1)। इसके बजाए, काउंटर केवल एक बार बढ़ता है, जब आप अपना सबक्लास (समस्या 2) परिभाषित करते हैं।

चूंकि जावास्क्रिप्ट में प्रोटोटाइप आधारित विरासत मॉडल है, इसलिए आपको एक ऑब्जेक्ट बनाना होगा जिसे प्रोटोटाइप के रूप में उपयोग किया जा सके। लेकिन मेरा सुझाव है कि आप इसे माता-पिता वर्ग के निर्माता (बिना समस्या के दूसरे भाग को हल करेंगे) को बुलाए बिना ऐसा करने के लिए करें। यह जावास्क्रिप्ट दुनिया में हर जगह इस्तेमाल किया जाने वाला एक बहुत ही आम पैटर्न है (Simple JavaScript Inheritance, Backbone, CoffeScript इत्यादि), और यदि आपको बहुत पुराने ब्राउज़र (IE6-8) का समर्थन करने की आवश्यकता नहीं है, तो इसे लागू करना बहुत आसान है। यह इस प्रकार है:

SedanCar.prototype = Object.create(Car.prototype) 

अब समस्या का पहला भाग ठीक करने के लिए काफी आसान है। जब भी बच्चा तत्काल होता है तो बस माता-पिता कन्स्ट्रक्टर को कॉल करें। यह भी एक अच्छा पैटर्न है, और यह कई अन्य भाषाओं (जावा, आदि) में बनाया गया है। जावास्क्रिप्ट में, आप मैन्युअल रूप से ऐसा करने के लिए, इस तरह होगा:

var SedanCar = function() { 
    // Parent class initialization 
    Car.call(this /*, and, other, arguments, to, the, parent, constructor */) 

    // Child class initialization 
}; 

इस नव निर्मित वस्तु के लिए बाध्य this साथ माता पिता निर्माता कॉल करेंगे। अभिभावक कन्स्ट्रक्टर प्रारंभिकता करता है, और फिर बच्चा यह काम का हिस्सा करता है। आपके उदाहरण में, माता-पिता काउंटर को बढ़ाएंगे जैसा आप उम्मीद करेंगे।

+0

धन्यवाद। Object.create मेरे लिए कुछ नया है: / –

संबंधित मुद्दे