2012-07-26 12 views
11

मैं जावास्क्रिप्ट में कुछ क्लास पदानुक्रम तैयार कर रहा हूं। यह अभी तक ठीक काम करता है, लेकिन मैं यह नहीं देख सकता कि यह निर्धारित करने के लिए कि कोई ऑब्जेक्ट एक अभिभावक वर्ग का "उदाहरण" है या नहीं। उदाहरण:जावास्क्रिप्ट ओओपी, उदाहरण और बेस क्लास

function BaseObject(name){ 
    this.name = name; 

    this.sayWhoAmI = function(){ 
     console.log(this.name + ' is a Derivation1 : ' + (this instanceof Derivation1)); 
     console.log(this.name + ' is a Derivation2 : ' + (this instanceof Derivation2)); 
     console.log(this.name + ' is a BaseObject : ' + (this instanceof BaseObject)); 
    }; 
} 
function Derivation1(){ 
    BaseObject.apply(this, ['first derivation']); 
} 
function Derivation2(){ 
    BaseObject.apply(this, ['second derivation']); 
} 

var first = new Derivation1(); 
var second = new Derivation2(); 

first.sayWhoAmI(); लॉग यह:

first derivation is a Derivation1 : true 
first derivation is a Derivation2 : false 
first derivation is a BaseObject : false 

जबकि second.sayWhoAmI(); लॉग यह:

second derivation is a Derivation1 : false 
second derivation is a Derivation2 : true 
second derivation is a BaseObject : false 

मैं दोनों first और second वस्तु होना चाहिए की तरह महसूस कहते हैं कि वे BaseObject के उदाहरण हैं।

मैं समझता हूं कि जावास्क्रिप्ट इसके लिए नहीं बनाया जा सकता है, लेकिन मुझे आश्चर्य है कि इसे प्राप्त करने का कोई तरीका है या नहीं।

+6

केवल बुला 'Base.apply (...)' नहीं है सेटअप विरासत। आपको प्रोटोटाइप को ठीक से सेट करना होगा। देखें: http://jsfiddle.net/fkling/wJE6s/। स्पष्टीकरण के लिए इस प्रश्न को भी देखें: http: // stackoverflow।कॉम/प्रश्न/3145700/जावास्क्रिप्ट-विरासत-उदाहरण-काम नहीं कर रहे हैं? rq = 1 –

+1

फ़ेलिक्स आपको इसे उत्तर के रूप में लिखना चाहिए, यही वही है जो मुझे चाहिए और आपका पहेली इसे प्रदर्शित करता है। किसी और को अपनी प्रतिष्ठा चुराओ मत! – Johnny5

+0

सहमत हैं कि उन्हें एक जवाब जोड़ना चाहिए, लेकिन शायद वह अपने प्रतिनिधि को .01% तक बढ़ाने के बारे में चिंतित नहीं है! – jahroy

उत्तर

10

केवल Base.apply(...) पर कॉलिंग विरासत सेट नहीं करता है। सभी .apply पहले तर्क के लिए this सेट कर रहा है, और कुछ भी नहीं। माता-पिता कन्स्ट्रक्टर को कॉल करना महत्वपूर्ण है, लेकिन यह पर्याप्त नहीं है।

आपको क्या करना है प्रोटोटाइप श्रृंखला को ठीक से स्थापित करना है। यही है, आपको Derivation1.prototype को Base.prototype से प्राप्त होने वाली किसी चीज़ पर सेट करना होगा।

के बाद से एक निर्माता समारोह के प्रत्येक उदाहरण के निर्माता कार्यों के प्रोटोटाइप से विरासत, आप कोड दिखाई देगा जैसे

Derivation1.prototype = new Base(); 

यह एक बुरा विचार है और आप पहले से ही देख सकते हैं क्यों: Base उम्मीद तर्क स्थापित करने के लिए उदाहरण के लिए विशिष्ट गुण (name)। लेकिन हमें इन गुणों की परवाह नहीं है, क्योंकि हम बाद में उन्हें Base.apply(this, ...) के साथ बाल कन्स्ट्रक्टर में शुरू कर रहे हैं।

तो हम सभी की जरूरत है एक वस्तु Base.prototype से इनहेरिट है और सौभाग्य से, ECMAScript 5 एक समारोह जो कर सकते हैं कि हम (polyfill) के लिए परिभाषित करता है:

Derivation1.prototype = Object.create(Base.prototype); 

यह Base.prototype से इनहेरिट एक नई वस्तु बनाता है।

Derivation1.prototype.constructor = Derivation1; 

नीचे एक पूरी उदाहरण है: अब, जब से तुम एक नई वस्तु के साथ मूल प्रोटोटाइप की जगह, आप constructor गुण सेट करने के लिए इतना है कि यह Derivation1 को सही ढंग से बताते है। this fiddle और this excellent answer by T.J. Crowder पर भी एक नज़र डालें, जो मूल रूप से एक ही समस्या को समझाता है, लेकिन शायद बेहतर तरीके से।


उदाहरण:

function BaseObject(name){ 
    this.name = name; 
} 

// move properties shared by all instances to the prototype! 
BaseObject.prototype.sayWhoAmI = function() { 
    console.log(this.name + ' is a Derivation1 : ' + (this instanceof Derivation1)); 
    console.log(this.name + ' is a Derivation2 : ' + (this instanceof Derivation2)); 
    console.log(this.name + ' is a BaseObject : ' + (this instanceof BaseObject)); 
}; 

function Derivation1(){ 
    BaseObject.apply(this, ['first derivation']); 
} 

Derivation1.prototype = Object.create(BaseObject.prototype); 
Derivation1.prototype.constructor = Derivation1; 

// some useless method of the child "class" 
Derivation1.prototype.someOtherMethod = function() { 
    return 42; 
}; 

var first = new Derivation1(); 
first.sayWhoAmI(); 

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