2014-07-11 15 views
5

हमारे टाइपप्रति कक्षाओं के सभी वारिस (प्रत्यक्ष या परोक्ष) से:टाइपप्रति MyObject.instanceOf()

export class WrObject { 
    className:string; 

    public instanceOf(name : String) : boolean { 
     return this.className === name; 
    } 
} 

हम तो के रूप में एक उपवर्ग की घोषणा:

export class Section extends WrObject { 
    public static CLASS_NAME = 'Section'; 
    className = Section.CLASS_NAME; 

     public instanceOf(name : String) : boolean { 
      if (this.className === name) 
       return true; 
      return super.instanceOf(name); 
     } 

} 

और तुम तो साथ जांच कर सकते हैं:

if (obj.instanceOf(Section.CLASS_NAME)) 

यह सब बढ़िया काम करता है। हालांकि, मुझे लगता है कि यह क्लीनर होगा यदि हम कर सकते हैं:

if (obj.instanceOf(Section)) 

क्या ऐसा करने का कोई तरीका है? या बेहतर दृष्टिकोण के रूप में कोई सुझाव?

धन्यवाद - डेव

उत्तर

13

आप जावास्क्रिप्ट आप की मूलरूप प्रकृति को स्वीकार करने के लिए तैयार हैं, तो कर सकते हैं सेंट instanceof जो प्रोटोटाइप श्रृंखला की जाँच करता है का उपयोग करें:

class Foo{} 
class Bar extends Foo{} 
class Bas{} 

var bar = new Bar(); 

console.log(bar instanceof Bar); // true 
console.log(bar instanceof Foo); // true 
console.log(bar instanceof Object); // true 

console.log(bar instanceof Bas); // false 
+0

मैंने सोचा था कि (नहीं पोस्ट अब यहां पा सकते हैं) कि instanceof का उपयोग कर गलत होने के रूप में टाइपप्रति में हतोत्साहित किया गया था। क्या मैंने अन्य धागे को गलत समझा? –

+1

निर्भर करता है। आप 'null' पर 'exampleof' का उपयोग करने की योजना नहीं बना रहे हैं? ;) + iframes के बीच अविश्वसनीय (यदि आप संदर्भ द्वारा जांचते हैं तो यह प्रत्येक फ्रेम में वही 'Foo.prototype' नहीं है जो यह नीचे कर रहा है)। वेबवर्कर्स में शायद एक ही मुद्दा है लेकिन मुझे यकीन नहीं है कि – basarat

+0

नल के साथ - नहीं। वेब श्रमिकों में - हाँ हर जगह। और यह एक थ्रेड में बनाए गए ऑब्जेक्ट्स के साथ है, दूसरे थ्रेड पर पोस्ट किया गया है, और प्राप्त करने वाले थ्रेड में हम प्राप्त डेटा को किसी ऑब्जेक्ट में वापस करने के लिए प्रोटो को असाइन करते हैं। –

0

मुझे लगता है कि यह काम हो सकता है Example on Playground

var getName = function(obj) : string { 
    var funcNameRegex = /function (.{1,})\(/; 
    var results = (funcNameRegex).exec(obj); 
    return (results && results.length > 1) ? results[1] : ""; 
}; 

class Foo 
{ 

} 

function IsTypeOf(obj: any, type: Function) 
{ 
    alert(obj.constructor.name + " == " + getName(type)); 
} 

IsTypeOf(new Foo(), Foo); 

संबंधित

2

तुम कर सकते हो। बस इस एक के साथ अपने instanceOf कार्यान्वयन की जगह:

public instanceOf(cls: { CLASS_NAME: string; }) { 
    return cls.CLASS_NAME === this.className || super.instanceOf(cls); 
} 
+2

इस तथ्य से सावधान रहें कि एक ही नाम के साथ अलग-अलग नामस्थानों में कक्षाएं एक समस्या हो सकती हैं। प्रोग्रामिंग। माता-पिता और वंशावली। माता-पिता विभिन्न विरासत के पेड़ और नामस्थानों में बहुत अलग वर्ग हैं, लेकिन यहां उनके गलत नामों का मिलान करने के कारण गलत तरीके से परीक्षण किया जाएगा। –