2012-06-19 19 views
5

मुझे पता है क्यों Three.js कोड इस तरह संरचित है चाहता हूँ:Three.js वंशानुक्रम स्वरूप

THREE.Camera = function(){ 
    THREE.Object3D.call(this); 
    //add more Camera specific properties and methods 
} 

THREE.Camera.prototype = new THREE.Object3D(); 
THREE.Camera.prototype.constructor = THREE.Camera; 

THREE.Camera.prototype.//add more camera specific methods... 

मुझे पता है क्यों वे प्रोटोटाइप के लिए वर्तमान निर्माता में आधार निर्माता फोन है और यह भी चाहते हैं?

MDN में वे इस तरह एक पैटर्न दिखाने:

subType = function(){ 
    //new properties for subType 
} 

subType.prototype = new baseType(); 

वे उप-प्रकार निर्माता में आधार निर्माता करने के लिए कॉल की जरूरत नहीं है, तो क्यों Three.js इस करता है?

+1

https://developer.mozilla.org/ एन/जावास्क्रिप्ट/गाइड/विवरण_of_the_Object_Model – Esailija

+1

[जावास्क्रिप्ट विरासत] के संभावित डुप्लिकेट (http://stackoverflow.com/questions/931660/javascript-inheritance) – Esailija

उत्तर

7

चूंकि प्रत्येक THREE.Object3D उदाहरण, THREE.Object3D.prototype से विरासत THREE.Camera.prototype इस तरह की स्थापना करके, प्रत्येक THREE.Camera उदाहरण भी THREE.Object3D.prototype से प्राप्त कर लेगा।

यदि आप ऐसा नहीं करते हैं, तो THREE.Camera उदाहरण THREE.Object3D.prototype पर निर्दिष्ट किसी भी गुण का उत्तराधिकारी नहीं होंगे।

तो, दोनों भागों महत्वपूर्ण हैं:

  • THREE.Camera.prototype उचित रूप से की स्थापना करके, नई उदाहरणों THREE.Object3D.prototype से प्राप्त कर लेंगे और इन गुणों सभी उदाहरणों द्वारा साझा हैं।

  • "पैरेंट" कन्स्ट्रक्टर फ़ंक्शन को कॉल करके आप प्रत्येक उदाहरण को इंस्टेंस-विशिष्ट डेटा के साथ प्रारंभ कर रहे हैं।


कहा कि, प्रोटोटाइप की स्थापना की तरह इस सबसे अच्छा तरीका नहीं है। क्या होगा अगर THREE.Object3D उन तर्कों की अपेक्षा करता है जिनके बिना निर्माता काम नहीं करेगा?

एक बेहतर दृष्टिकोण के बाद से यह सब है, एक खाली वस्तु जो THREE.Object3D.prototype से विरासत बनाने के लिए है आप की जरूरत:

THREE.Camera.prototype = Object.create(THREE.Object3D.prototype); 
THREE.Camera.prototype.constructor = THREE.Camera; 

संदर्भ:Object.create

+0

मैं इसके बजाय Object.create का उपयोग करने के लिए सहमत हूं! –

+0

यदि आप ऑब्जेक्ट 3 डी प्रोटोटाइप से विधियों को कैमरा ऑब्जेक्ट्स पर उपलब्ध करना चाहते हैं, तो क्या आप सीधे Camera3prototype को ऑब्जेक्ट 3 डी.प्रोटोटाइप -> 'THREE.Camera.prototype = THREE.Object3D.prototype' पर असाइन नहीं कर सकते हैं? इसकी एक नई प्रति बनाने की आवश्यकता क्यों है? तो आप मूल प्रति को प्रभावित किए बिना इसमें नए तरीके जोड़ सकते हैं? – 0xor1

+0

@ डैनीआर: बिल्कुल। यदि आप 'THREE.Camera.prototype = THREE.Object3D.prototype' करेंगे तो आपके द्वारा' THREE.Camera.prototype' में किए गए कोई भी परिवर्तन 'THREE.Object3D.prototype' को भी प्रभावित करेंगे। यही कारण है कि आप इस स्तर का संकेत चाहते हैं (जैसा कि मैं इसे कॉल करूंगा)। आपके संपादन के संबंध में, यह मेरी सूची में दूसरा बिंदु है। यदि आप नहीं चाहते हैं तो आपको अभिभावक कन्स्ट्रक्टर को कॉल करने की आवश्यकता नहीं है, लेकिन ऐसा करना उचित है। –

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