"कक्षा" बनाने के लिए आप किस शैली का उपयोग करते हैं?

जावास्क्रिप्ट में कक्षा-जैसे व्यवहार प्राप्त करने के कुछ तरीके हैं, सबसे आम इस तरह आधारित प्रोटोटाइप प्रतीत होता है:

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
ro fr bn
मेरे परीक्षणों से पता चला है कि बंद आधारित दृष्टिकोण धीमा है। आपको प्रत्येक ऑब्जेक्ट के लिए एक अलग बंद करने की आवश्यकता है। प्रोटोटाइप दृष्टिकोण सभी उदाहरणों के साथ विधियों को साझा करता है।
जोड़ा लेखक Juan Mendes, स्रोत

7 उत्तर

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

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

Prototype.js प्रलेखन: कक्षाएं और विरासत परिभाषित करना

0
जोड़ा
मुझे नहीं लगता कि ओपी एक रैपर के लिए पूछ रहा था जो विवरण छुपाता है। वह जानना चाहता था कि आप या तो दृष्टिकोण क्यों चुनेंगे, इसलिए वह लाभों का वजन कर सकता है
जोड़ा लेखक Juan Mendes, स्रोत

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

0
जोड़ा

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

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

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

0
जोड़ा

आपके पास भी विकल्प है:

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

जो संभवतः दो उदाहरण के रूप में धीमा है, लेकिन यह जावा / सी # की तरह दिखता है और थोड़ा और स्पष्ट है।

0
जोड़ा

प्रोटोटाइप के लिए ऑब्जेक्ट शाब्दिक दृष्टिकोण भी है:

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
जोड़ा
यदि आप किसी अन्य चीज़ से विरासत में हैं, तो आप शाब्दिक प्रोटोटाइप ऑब्जेक्ट सेट नहीं कर सकते हैं, जो पिछले प्रोटोटाइप को ओवरराइड करेगा
जोड़ा लेखक Juan Mendes, स्रोत
आप सही हैं - लेकिन इस मामले में, "वेक्टर" एक नई वस्तु है, इसलिए मुझे विरासत के मुद्दों के बारे में चिंता करने की आवश्यकता नहीं दिखाई दे रही थी
जोड़ा लेखक JayTee, स्रोत

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

हालांकि वस्तुएं हैं। जावास्क्रिप्ट में ऑब्जेक्ट बनाने के लिए आपको कक्षा की आवश्यकता नहीं है। इसमें कंडक्टर फ़ंक्शन हैं जो आप उदाहरण के लिए नए के साथ आवेदक कर सकते हैं:

var james = new Person();

आप वर्ग जैसे व्यवहार को अनुकरण कर सकते हैं:

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

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';
    }
}
0
जोड़ा

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

0
जोड़ा