2012-05-26 16 views
9

मैं यह पता लगाने की कोशिश कर रहा हूं कि मेरे जावास्क्रिप्ट कक्षाओं (या सिंगलटन ऑब्जेक्ट्स) को सही तरीके से कैसे बनाया जाए।जावास्क्रिप्ट क्लास बनाने का सही तरीका क्या है?

var obj = new Object(); 
obj.foo = 'bar'; 
obj.method = function() { ...} 

var obj = { 
    foo : 'bar', 
    method : function() { ...} 
} 

var obj = function(){} 
obj.prototype = { 
    foo : 'bar', 
    method: function() { ... } 
} 

मैं कुछ गुण सेट करने और उपलब्ध विधियों को असाइन करने में सक्षम होना चाहता हूं। मैं वस्तुओं पर mixins जैसी चीजों का उपयोग करने में सक्षम होना चाहूंगा ताकि मैं इन वस्तुओं को events जैसी चीज़ों के साथ बढ़ा सकूं।

+5

नियम # 1: कभी भी 'नया ऑब्जेक्ट() 'का उपयोग न करें। – Ryan

+0

@minitech, आपको यकीन है? उन्होंने इसे किसी कारण से बनाया होगा। – Xeoncross

+0

@ एक्सोनक्रॉस: ऐसा नहीं है कि मुझे पता है। :-) –

उत्तर

8

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

उन लोगों ("कक्षाओं" और सिंगलटन ऑब्जेक्ट्स) के बीच एक बड़ा अंतर है। आपके पहले उदाहरण उदाहरण एक-ऑफ ऑब्जेक्ट्स (सिंगलेट्स) हैं। आपका तीसरा (अंतिम) उदाहरण कन्स्ट्रक्टर फ़ंक्शन बनाता है जो आपको एक ही प्रोटोटाइप साझा करने वाली एकाधिक ऑब्जेक्ट्स बनाने की अनुमति देगा। मैं बढ़ाने निर्माता समारोह पर prototype संपत्ति बजाय यह जगह के रूप में आप कर रहे हैं, की सिफारिश करेंगे जैसे:

var Thingy = function() { // Or use a function declaration rather than expression 
    // Optional initialization code here 
}; 
Thingy.prototype.foo = 'bar'; 
Thingy.prototype.method = function() { 
    // Method code here 
}; 

(। निर्माता काम करता है, प्रथा के अनुसार, एक अपर केस अक्षर से शुरू)

जो आप उपयोग करते हैं (सिंगलटन या कन्स्ट्रक्टर फ़ंक्शन) आपको जो चाहिए उसे निर्भर करता है।

ES2015 (उर्फ "ES6") के रूप में, यह आसान है, हालांकि गैर-विधि प्रोटोटाइप संपत्ति (आपके foo) को परिभाषित करने के लिए कोई नया वाक्यविन्यास नहीं है; वहाँ शायद ES2017 या ES2018 में हो जाएगा, एक बार this proposal चाल आगे है, लेकिन तब तक:

class Thingy { 
    constructor() { 
     // Optional initialization code here 
    } 
    method() { 
    // Method code here 
    } 
} 
Thingy.prototype.foo = 'bar'; 

आप विरासत पदानुक्रम में प्राप्त करने की आवश्यकता, पुराने ES5 वाक्य रचना में पाइपलाइन का एक उचित बिट शामिल होती है, तो:

var Base = function() { 
}; 
Base.prototype.method = function(arg1) { 
    // ... 
}; 

var Derived = function() { 
    Base.call(this); 
}; 
Derived.prototype = Object.create(Base.prototype); 
Derived.prototype.constructor = Derived; 
Derived.prototype.method = function(arg1) { 
    // Using Base's `method`, if desired, is a bit ugly: 
    Base.prototype.method.call(this, arg1); 
}; 

... है यही वजह है कि आप पुस्तकालयों में कदम रख, प्रोटोटाइप के Class सामान, या अपने खुद के Lineage की तरह देखने के लिए इस्तेमाल किया; उन हालांकि, ES2015 वाक्य रचना से पुराने हो गए हैं, whcih यह पूरी तरह आसान बनाता है:

class Base { 
    method(arg1) { 
     // ... 
    } 
} 
class Derived extends Base { 
    method(arg1) { 
     // Use's the superclass's `method`, if desired, is easy: 
     super.method(arg1); 
    } 
} 

पुन शीर्षक आपके प्रश्न के:

सही तरीका एक जावास्क्रिप्ट वर्ग बनाने के लिए क्या है?

, कई समान रूप से सही तरीके जावास्क्रिप्ट में वस्तुओं की "वर्गों" बनाने के लिए कर रहे हैं क्योंकि जावास्क्रिप्ट एक बहुत लचीला भाषा है। मानक कन्स्ट्रक्टर फ़ंक्शंस, "बिल्डर" फ़ंक्शन, Object.create (ES5- सक्षम वातावरण पर) हैं जो आपको अधिक प्रत्यक्ष प्रोटोटाइपल विरासत और कई अन्य लोगों को करने देता है। जावास्क्रिप्ट के बारे में महान चीजों में से एक यह है कि आप अपनी "कक्षा" की शैली चुनने के लिए मिलता है।

1

आप भी तरह कुछ का उपयोग कर सकते हैं: आप एक ब्राउज़र या पर्यावरण ES5 का समर्थन करता है कि लक्षित कर रहे हैं

function O(x,y) { 
    this.x=x; 
    this.y=y; 
    this.method=function() {...} 
    return this; 
} 

var o=new O(0,0); 
0

, तो आप ऐसा कर सकते हैं:

var Person = { 
    foo: ..., 
    bar: ... 
}; 

var Mike = Object.create(Person, { baz: ... }); 
1

आप के लिए देख रहे हैं एक सैद्धांतिक एक के बजाय एक व्यावहारिक समाधान, आप एक ढांचे का बेहतर उपयोग करते हैं।

  • Backbone.js आपको मिश्रित और एक ईवेंट सिस्टम समेत सभी की आवश्यकता है।

आप कुछ विगेट्स भी जरूरत है, पर विचार

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

विरासत संरचना जो इन ढांचे को प्रदान करती है, सामान्य वर्ग-आधारित एक (जावा सोचें) की तरह महसूस करती है। ऐसा इसलिए है क्योंकि वे आंतरिक वस्तुओं को आंतरिक रूप से बनाते हैं जो दूसरों के लिए केवल prototype एस के रूप में कार्य करते हैं, और इस प्रकार कक्षाओं की भूमिका निभाते हैं।

उदाहरण के लिए, जब आप Ext.define('MyClass', {extend: 'ParentClass', mixins: foo, ... }) कहते हैं, तो Ext एक function "MyClass" बनाता है, और एक गुमनाम वस्तु (MyClass.prototype) जो तरीकों रखती है आपके द्वारा दी गई।

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

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