अब हम 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
अगर वहाँ एक बेहतर तरीका है, मुझे पता है कि यह क्या है अच्छा लगेगा।
क्या आप ऐसी लाइब्रेरी का उपयोग कर रहे हैं जो जावास्क्रिप्ट में शास्त्रीय विरासत लागू करता है? – Nosredna
नहीं, मैं सिर्फ सादे पुराने जावास्क्रिप्ट का उपयोग कर रहा हूं: डी – kgrad