2016-04-17 6 views
7

में किसी उदाहरण का उदाहरण कैसे बनाते हैं, मैं अलग-अलग लोगों को पकड़ने वाली कारों के सेट के अनूठे उदाहरण बनाना चाहता हूं। कारों में समान आधार चश्मा होंगे लेकिन उनकी कुछ संपत्तियां और विधियां अलग-अलग होंगी।आप जावास्क्रिप्ट

मेरी समस्या यह है कि मैं काम नहीं कर सकता कि यह कैसे काम करना चाहिए। जावास्क्रिप्ट में उदाहरणों के उदाहरणों के साथ आप कैसे निपटते हैं या बनाते हैं?

var Car = function(make, country) { 
    this.make = make; 
    this.country = country; 
}; 

var Ferrari = new Car('Ferrari', 'Italy'); 

var fred = new Person() {}; 
var fred.cars['Ferrari'] = new Ferrari(1200, 300000); 

यह स्पष्ट कारणों से इस त्रुटि का कारण बनता है। मुझे पता है कि यह एक कन्स्ट्रक्टर नहीं है (नीचे देखें)।

Uncaught TypeError: Ferrari is not a constructor 

जो मैं ढूंढ रहा हूं वह ऐसा कुछ है। फेरारी के प्रत्येक अलग-अलग उदाहरण में एक अलग मूल्य और मिलेज होगा।

var Ferrari = function(currentPrice, miles) } 
    this.currentPrice = currentPrice; 
    this.miles = miles; 
    // this is an instance of car, aka it needs the result of this: 
    // new Car('Ferrari', 'Italy'); 

}; 

फ्रेड का फेरारी फेरारी का एक उदाहरण है, जो कार का एक उदाहरण है। समस्या यह है कि मैं कन्स्ट्रक्टर को कन्स्ट्रक्टर बनाने का तरीका नहीं सोच सकता। क्या ऐसा करने का कोई तरीका है, या क्या मैं इस बारे में गलत तरीके से जा रहा हूं?

अन्य नोट्स:

मैं जानता हूँ कि मैं अनिवार्य रूप से सिर्फ कार के प्रत्येक प्रकार के एक स्थिर JSON जैसी वस्तु बनाने और फिर उस के उदाहरण बनाने के लिए और नए अनन्य मानों जोड़ सकते हैं। हालांकि, मैं कार को एक कन्स्ट्रक्टर के रूप में रखने में सक्षम होना चाहता हूं ताकि जब मुझे आवश्यकता हो तो मैं आसानी से और अधिक कर सकता हूं।

मैं स्पष्ट रूप से यहाँ OOP या जावास्क्रिप्ट की कुछ समझ याद आ रही है, लेकिन यह अगर किसी ने मुझे सही दिशा में बात कर सकता है बहुत अच्छा होगा।

+1

'फेरारी' एक सबक्लास होना चाहिए, उदाहरण के लिए नहीं; इसे 'कार बढ़ाता है '। – jonrsharpe

+0

जो भी मेरे रूप में भ्रमित था, उसके लिए एमडीएन पर एक अच्छा पृष्ठ है जो क्लास-आधारित भाषाओं की तुलना में जेएस में ऑब्जेक्ट पदानुक्रम बनाने के तरीके के बारे में और बताता है: https://developer.mozilla.org/en/docs/ वेब/जावास्क्रिप्ट/गाइड/विवरण_of_the_Object_Model – jamcd

उत्तर

5

क्या आप देख रहे हैं एक व्युत्पन्न निर्माता और संबद्ध प्रोटोटाइप है, कभी कभी एक उपवर्ग कहा जाता है।

पुराने जमाने ES5 में यह इस तरह दिखता है:

var Car = function(make, country) { 
    this.make = make; 
    this.country = country; 
}; 
var Ferrari = function(currentPrice, miles) { 
    Car.call(this, "Ferrari", "Italy"); 
    this.currentPrice = currentPrice; 
    this.miles = miles; 
}; 
Ferrari.prototype = Object.create(Car.prototype); 
Ferrari.prototype.constructor = Ferrari; 

कि कैसे काम करता है:

  • Ferrari एक निर्माता समारोह, जब कहा जाता है, कहता है कि Carthis के साथ नए की चर्चा करते हुए है उदाहरण के साथ, Car तर्कों के साथ। Car इसकी बात उदाहरण पर उन गुणों को स्थापित करती है। फिर हम Ferrari के कोड के साथ जारी रखते हैं, जिसमें तर्क पारित होते हैं और (उपरोक्त में) उन्हें गुणों के रूप में याद करते हैं।

  • हमें यह सुनिश्चित करना है कि उद्देश्य यह है कि new Ferrari (जो Ferrari.prototype से लिया जाता है) द्वारा उदाहरणों को सौंपा जाएगा अपने प्रोटोटाइप वस्तु के रूप में Car.prototype का उपयोग करता है, ताकि यदि आप Car.prototype के लिए चीजों को जोड़ने, वे के रूप में Ferrari रों पर उपस्थित हो जाएगा कुंआ।

  • हम सुनिश्चित करते हैं कि मानक constructorFerrari.prototype पर संपत्ति Ferrari पर संदर्भित करती है।

बल्कि ES2015 (जो आप इस तरह के Babel जैसे उपकरणों के साथ के रूप में transpilation के माध्यम से आज का उपयोग कर सकते हैं,) में अच्छे:

class Car { 
    constructor(make, country) { 
     this.make = make; 
     this.country = country; 
    } 
} 
class Ferrari extends Car { 
    constructor(currentPrice, miles) { 
     super("Ferrari", "Italy"); 
     this.currentPrice = currentPrice; 
     this.miles = miles; 
    } 
} 
+0

@ Jordão: धन्यवाद! फिक्स्ड। –

+0

ES2015 उदाहरण PHP में जो मैंने देखा है उसके समान दिखता है, लेकिन जावास्क्रिप्ट में एक समान सुविधा नहीं मिल सका। धन्यवाद! – jamcd

+1

यह भी उल्लेख करता है कि ओपी का वर्ग मॉडल टूटा हुआ है - 'मूल्य' और' मील' गुण वास्तव में बेस क्लास – Alnitak

-1

आप कंस्ट्रक्टर्स होने की Car उदाहरणों चाहते हैं, Car एक निर्माता लौटना चाहिए ।

समस्या यह है कि यह के बजाय Function.prototype से प्राप्त होगा। यदि यह अवांछनीय है, यह तय करने के लिए Object.setProtetypeOf का उपयोग करें:

function Person() { 
    this.cars = {}; 
} 
function Car(make, country) { 
    var instance = function(currentPrice, miles) { 
    this.currentPrice = currentPrice; 
    this.miles = miles; 
    }; 
    instance.make = make; 
    instance.country = country; 
    Object.setPrototypeOf(instance, Car.prototype); // slow!! 
    return instance; 
} 
var Ferrari = new Car('Ferrari', 'Italy'); 
var fred = new Person(); 
fred.cars.ferrari = new Ferrari(1200, 300000); 

वैकल्पिक रूप से, आप एक तरीका है जिसके "का दृष्टांत" करने के लिए अपने उदाहरणों का उपयोग किया जाएगा जोड़ सकते हैं।

function Person() { 
    this.cars = {}; 
} 
function Car(make, country) { 
    this.make = make; 
    this.country = country; 
} 
Car.prototype.instantiate = function(currentPrice, miles) { 
    var instance = Object.create(this); 
    instance.currentPrice = currentPrice; 
    instance.miles = miles; 
    return instance; 
}; 
var ferrari = new Car('Ferrari', 'Italy'); 
var fred = new Person(); 
fred.cars.ferrari = ferrari.instantiate(1200, 300000); 
+0

वैकल्पिक विकल्प प्रदान करने के लिए धन्यवाद। अगर आपको मुझसे कोई फर्क नहीं पड़ता है, तो क्या 'कॉल' विधि के बजाय इसका उपयोग करने का कोई फायदा है? – jamcd

+0

@jamcd वे अलग-अलग दृष्टिकोण हैं। विस्तारित एक से सुपर कन्स्ट्रक्टर को कॉल करने के लिए उप-वर्गीकरण करते समय 'कॉल' का उपयोग किया जाता है। लेकिन आप उदाहरणों को तुरंत चालू करना चाहते हैं, न कि उप-नियंत्रक। तो सुपर कन्स्ट्रक्टर को उस इंस्टेंस को बनाने के लिए पहले से ही बुलाया गया है जिसे आप तुरंत चालू करना चाहते हैं, और उसके बाद इसे फिर से कॉल करने का कोई कारण नहीं है। सबक्लासिंग पर प्रदान किए गए दृष्टिकोणों का लाभ यह है कि आपको कार नामों (जैसे फेरारी) को पहले से जानने की आवश्यकता नहीं है। प्रश्न से, मैं समझ गया कि यह वही था जो आप चाहते थे, उपclassing नहीं। – Oriol

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