5

मैं कैसे परीक्षण कर सकते हैं अगर एक जावास्क्रिप्ट वस्तु Google Closure inheritance mechanism का उपयोग कर एक अंतरफलक के एक कार्यान्वयन है में इंटरफ़ेस के कार्यान्वयन है?टेस्ट अगर वस्तु गूगल बंद वर्ग ढांचे


मैं new my.Dog() और object instanceof my.Animal के माध्यम से बनाया काम नहीं किया वस्तुओं में my.Animal के किसी भी संकेत नहीं मिल सका। इंटरफ़ेस के बारे में एकमात्र जानकारी बच्चे वर्ग में विधियों को लागू करने के लिए भूल जाते समय संकलक त्रुटियां होती हैं।

/** 
* @interface 
*/ 
my.Animal = function() {}; 

/** 
* Does something. 
* @return {string} 
*/ 
my.Animal.prototype.doSomething; 

/** 
* @constructor 
* @implements {my.Animal} 
*/ 
my.Dog = function() {}; 

/** @inheritDoc */ 
my.Dog.prototype.doSomething() = function { 
    return "something"; 
} 

var dog = new my.Dog(); 
console.log(dog instanceof my.Animal); // returns false 

एक तरह से मैंने पाया, इंटरफेस की संपत्ति के लिए लगभग परीक्षण करने के लिए है, हालांकि है कि इतने सारे पहलुओं के बारे में बुरा है:

console.log(!!dog.doSomething); // returns true 
+2

मैं क्या गलत करने से पहले downvoted होने के बारे में एक टिप्पणी पाने के लिए प्यार होता। –

उत्तर

2

@interface विशुद्ध रूप से एक प्रकार चेकर निर्माण है। असम्पीडित कोड में रनटाइम चेक के लिए कोई वायरिंग जोड़ने के लिए @interface/@implements के लिए टिप्पणियों का निरीक्षण नहीं कर सकता है। क्लोजर का लक्ष्य यह है कि कोड संकलन से पहले और बाद में चलाएगा (यह मानते हुए कि आप ऑप्टिमाइज़ेशन मोड के लिए प्रतिबंध का निरीक्षण करते हैं)।

my.Dog.prototype.implements_my_Animal = true; 
तो

if (foo.implements_my_Animal) ... 

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

+0

ध्यान दें: आप शायद की तरह '(foo.implements_my_Animal === the_object) सच के बजाय एक प्रहरी वस्तु जोड़ सकते हैं और तुल्यता लिए जाँच करनी चाहिए,' के बाद से अन्यथा आप गलत परिणामों की मिल जाएगा जब एक वस्तु एक ही कुंजी परिभाषित करने के लिए होता है। अग्रिम संकलन के बाद यह आसानी से हो सकता है जो इसे 'foo.a' जैसा कुछ नाम देता है। Clojurescript में हमें कुछ ऐसा सामना करना पड़ा: https://dev.clojure.org/jira/browse/CLJS-1658 – ClojureMostly

1

आप सीधे नहीं कर सकते।

क्लोजर-कंपाइलर प्रकार प्रणाली में, @extends विरासत के लिए उपयोग किया जाता है और instanceof परीक्षणों से संबंधित है। इंटरफेस कार्यान्वयन @implements द्वारा दर्शाए गए सख्ती से संकलन समय की जांच कर रहे हैं। वे एक वादा है कि आपके ऑब्जेक्ट में विधियों और गुण शामिल हैं जो इंटरफ़ेस की परिभाषाओं से मेल खाते हैं।

जैसे, एक व्यापक फैशन में कार्यावधि में उनके लिए परीक्षण करने के लिए, आप अस्तित्व और इंटरफ़ेस से प्रत्येक संपत्ति के प्रकार के लिए जाँच करने के लिए की आवश्यकता होगी।

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