2008-08-09 8 views
16

कुछ तरीकों का उपयोग जावास्क्रिप्ट में वर्ग की तरह व्यवहार पाने के लिए कर रहे हैं, सबसे आम इस तरह आधारित प्रोटोटाइप होने लगते हैं:"कक्षा" बनाने के लिए आप किस शैली का उपयोग करते हैं?

function Vector(x, y, x) { 
    this.x = x; 
    this.y = y; 
    this.z = z; 
    return this; 
} 

Vector.prototype.length = function() { return Math.sqrt(this.x * this.x ...); } 

और बंद आधारित दृष्टिकोण समान

function Vector(x, y, z) { 
    this.length = function() { return Math.sqrt(x * x + ...); } 
} 

विभिन्न कारणों के लिए करने के लिए उत्तरार्द्ध तेज़ है, लेकिन मैंने प्रोटोटाइप संस्करण को देखा है (और मैं अक्सर लिखता हूं) और उत्सुक था कि अन्य लोग क्या करते हैं।

+0

मेरे परीक्षणों से पता चला है कि बंद आधारित दृष्टिकोण धीमा है। आपको प्रत्येक ऑब्जेक्ट के लिए एक अलग बंद करने की आवश्यकता है। प्रोटोटाइप दृष्टिकोण सभी उदाहरणों के साथ विधियों को साझा करता है। –

उत्तर

9

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

हालांकि यह बाद तकनीक उपयोगी है यदि आप इसे स्वयं की प्रतिलिपि, कि निजी/विशेषाधिकार तरीकों जो निजी चर निर्माता के अंदर घोषित कर दिया और बंद करने के माध्यम से विरासत में मिला है की पहुंच है क्या करने के लिए किया जा रहा है का मुख्य फायदा नहीं है के लिए प्रत्येक प्रतिलिपि चाहते तंत्र।

डगलस क्रॉकफ़ोर्ड का अच्छा summary है।

2

ठीक है, मेरे पास वास्तव में इस पर कोई विशेषज्ञ राय नहीं है। मैं आमतौर पर क्लोजर आधारित दृष्टिकोण का उपयोग करके समाप्त होता हूं क्योंकि यह कोड को प्रबंधक के लिए सरल रखता है। लेकिन, मैंने खुद को विधियों के लिए प्रोटोटाइप का उपयोग किया है जिसमें कोड की रेखाएं हैं।

2

तुम भी करने का विकल्प है:

function Vector(x, y, z) { 
    function length() { 
    return Math.sqrt(x * x + ...); 
    } 
} 

कौन सा शायद बस के रूप में उदाहरण के रूप में दो धीमी है, लेकिन इसे और अधिक की तरह जावा/सी # लग रहा है और थोड़ा और स्पष्ट है।

3

सौभाग्य से मुझे prototype.js का उपयोग करना है, जो कुछ अच्छे रैपर प्रदान करता है। तो अगर आप ऐसा कर सकते हैं:

var Person = Class.create({ 
    initialize: function(name) { 
     this.name = name; 
    }, 
    say: function(message) { 
     return this.name + ': ' + message; 
    } 
}); 

Prototype.js Documentation: Defining classes and inheritance

+0

मुझे नहीं लगता कि ओपी एक रैपर के लिए पूछ रहा था जो विवरण छुपाता है। उन्होंने कहा कि पता करने के लिए तुम क्यों या तो चुनते हैं दृष्टिकोण, तो वह लाभ –

4

वहाँ भी प्रोटोटाइप करने के लिए वस्तु शाब्दिक दृष्टिकोण है:

var Vector = function(){}; 

Vector.prototype = { 
    init:function(x,y,z) { 
    this.x = x; 
    this.y = y; 
    this.z = z; 
    }, 
    length:function() { 
    return Math.sqrt(x * x + ...); 
    } 
}; 

var v1 = new Vector(); 
v1.init(1,2,3); 
+0

आप शाब्दिक प्रोटोटाइप वस्तु निर्धारित नहीं कर सकते आप कुछ और से इनहेरिट कर रहे हैं, जो पिछले प्रोटोटाइप –

+0

आप सही हैं ओवरराइड होगा बाहर वजन कर सकते हैं चाहता था - लेकिन इस मामले में, "वेक्टर" एक नई वस्तु है, इसलिए मुझे विरासत के मुद्दों के बारे में चिंता करने की कोई आवश्यकता नहीं दिखाई दे रही थी – JayTee

1

मैं इसके लिए John Resig's library का उपयोग कर के एक बड़े प्रशंसक हूँ। हल्के, सीधे आगे, और आप पहले से ही जानते हैं कि इसका उपयोग कैसे करें यदि आप 'सामान्य' ऑब्जेक्ट उन्मुख शैली से परिचित हैं।

1

जावास्क्रिप्ट में कोई कक्षा नहीं है।

हालांकि ऑब्जेक्ट्स हैं। जावास्क्रिप्ट में ऑब्जेक्ट बनाने के लिए आपको कक्षा की आवश्यकता नहीं है।

प्रोटोटाइप उदाहरण:

function Car (type) { 
    this.type = type; 
    this.color = "red"; 
} 

Car.prototype.getInfo = function() { 
    return this.color + ' ' + this.type + ' car'; 
}; 

वस्तु शाब्दिक उदाहरण

var car = { 
    type: "honda", 
    color: "red", 
    getInfo: function() { 
     return this.color + ' ' + this.type + ' car'; 
    } 
} 

var james = new Person(); 

आप के साथ व्यवहार की तरह वर्ग अनुकरण कर सकते हैं: यह constuctor कार्यों है कि आप उदाहरण के लिए नए के साथ आह्वान कर सकते हैं है

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