2009-02-08 11 views
10

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

उदाहरण के लिए:

function foo(class1, class2) { 
    // Test to see if the parameter is a class. 
    if(class1 is a class) 
    { 
    //do some kind of class comparison. 
    if(class2 is a class) 
    { 
     if(class1 instanceof class2) 
     { 
      //... 
     } 
    } 
    else 
    { 
     //... 
    } 
    } 
    else 
    //... 
} 

यह संभव है? मुझे जवाब देने में परेशानी हो रही है।

+0

क्या आप ऐसी लाइब्रेरी का उपयोग कर रहे हैं जो जावास्क्रिप्ट में शास्त्रीय विरासत लागू करता है? – Nosredna

+0

नहीं, मैं सिर्फ सादे पुराने जावास्क्रिप्ट का उपयोग कर रहा हूं: डी – kgrad

उत्तर

15

वहाँ के रूप में वास्तव में ऐसी कोई बात नहीं है जावास्क्रिप्ट में एक "वर्ग" - सब कुछ प्राइमेटिव्स एक वस्तु है। यहां तक ​​कि कार्य वस्तुएं हैं।

उदाहरण के साथ काम करता है। यह link देखें।

function Car(make, model, year) 
{ 
    this.make = make; 
    this.model = model; 
    this.year = year; 
} 
var mycar = new Car("Honda", "Accord", 1998); 
var a = mycar instanceof Car; // returns true 
var b = mycar instanceof Object; // returns true 
+1

"सबकुछ एक वस्तु है" - बिल्कुल नहीं। आदिम प्रकार (संख्या, स्ट्रिंग, बूल, नल और अपरिभाषित) वस्तुएं नहीं हैं। –

+1

@AndreasGrech - बिल्कुल नहीं, यहां तक ​​कि आदिम प्रकारों में गुण और विधियां और प्रोटोटाइप श्रृंखला आदि हैं ... इसलिए वे किसी प्रकार की वस्तु भी हैं – Luckylooke

4

जावास्क्रिप्ट में कक्षाएं नहीं हैं। इसमें फ़ंक्शन हैं, जब new के साथ उपयोग किया जाता है, ऑब्जेक्ट इंस्टेंस बनाने के लिए उपयोग किया जा सकता है। इसलिए, आप वास्तव में परीक्षण करना चाहते हैं कि class2 एक फ़ंक्शन है या नहीं। इसे पूरा करने के कई तरीके हैं; वर्तमान (1.3) jQuery में isFunction() के कार्यान्वयन के इस तरह दिखता है:

isFunction: function(obj) { 
    return toString.call(obj) === "[object Function]"; 
}, 

... लेकिन यहाँ विभिन्न तरीकों की एक ठहरनेवाला के लिए देखें: Best method of testing for a function in JavaScript?

0

अब हम ES6 के देशी कार्यान्वयन है, वहाँ "वास्तविक वर्ग" कर रहे हैं। यह मुख्य रूप से प्रोटोटाइप कार्यों के लिए प्रोटोटाइप विरासत के लिए सिंटेक्टिक चीनी हैं, लेकिन सूक्ष्म मतभेद हैं और दोनों पूरी तरह से अदला-बदले नहीं हैं।

अब तक, एक ही रास्ता मैं पाया है अगर यह या class साथ शुरू होता है वस्तु के प्रोटोटाइप के निर्माता समारोह के .toString() हो और जांच करने के लिए है वस्तु एक निर्माता और class साथ कि आरंभ की .toString() है या नहीं।

ध्यान दें कि यदि आपका कोड संकलित किया गया है (यानी: सबसे कोलाहल या टाइपप्रति व्यवस्था), तो यह function... बजाय class... कार्यावधि में वापस आ जाएगी (के बाद से कक्षाएं निर्माता कार्यों के लिए transpiled रहे हैं)।

function isClass(obj) { 
    const isCtorClass = obj.constructor 
     && obj.constructor.toString().substring(0, 5) === 'class' 
    if(obj.prototype === undefined) { 
    return isCtorClass 
    } 
    const isPrototypeCtorClass = obj.prototype.constructor 
    && obj.prototype.constructor.toString 
    && obj.prototype.constructor.toString().substring(0, 5) === 'class' 
    return isCtorClass || isPrototypeCtorClass 
} 

यह केवल मूल वातावरण (क्रोम, फायरफॉक्स, एज, Node.js, आदि) कि कोड है कि function को transpiled नहीं किया गया के लिए class को लागू किया है में काम करेंगे।

उपयोग:

class A {} 
class B extends A {} 
isClass(A) // true 
isClass(new A()) // true 
isClass(B) // true 
isClass(new B()) // true 

function C() {} 
isClass(C) // false 
isClass(new C()) // false 
isClass({}) // false 
isClass(Date) // false 
isClass(new Date()) // false 

//These cases return 'true' but I'm not sure it's desired 
isClass(Object.create(A)) // true  
const x = {} 
Object.setPrototypeOf(x, A) 
isClass(x) // true 

अगर वहाँ एक बेहतर तरीका है, मुझे पता है कि यह क्या है अच्छा लगेगा।

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