2012-12-07 33 views
7

Possible Duplicate:
set attribute with javascript super methodकॉलिंग उपवर्ग से सुपर क्लास विधि - जावास्क्रिप्ट

मैं मनोरंजन के लिए एचटीएमएल 5 में एक सरल खेल बनाने के लिए कोशिश कर रहा हूँ। मेरे पास एक एंटिटी क्लास है जिसे प्लेयर क्लास का सुपरक्लास माना जाता है।

function Entity(x, y) { 

    this.x = x; 
    this.y = y; 

    this.tick = function() { 
     //Do generic stuff 
    } 
} 

function Player(x, y) { 

    this.parent.constructor.call(this, x, y); 

    this.tick = function() { 
     //Do player-specific stuff 
     this.parent.tick.call(this); 
    } 
} 

Player.prototype = new Entity(); 
Player.prototype.constructor = Player; 
Player.prototype.parent = Entity.prototype; 

समस्या इस लाइन पर है:

this.parent.tick.call(this); 

मैं क्रोम का JavaScript कंसोल में दिखाया गया है कोई त्रुटि मिलती है: "Uncaught TypeError: विधि कॉल नहीं कर सकता अपरिभाषित की 'कॉल'"।

मुझे यह नहीं मिला है और मैंने एक समान समस्या के पदों को खोजने का प्रयास करने में काफी समय लगाया है। सुपरक्लास 'कन्स्ट्रक्टर को मेरा कॉल ठीक काम करता है लेकिन सुपरक्लास' टिक विधि पर कॉल काम नहीं करता है।

मैं गेम बनाने के लिए बहुत नया हूं इसलिए मुझे नहीं पता कि यह एक अच्छा सेटअप है (उपclass टिक से सुपरक्लस टिक को कॉल करना)। यदि लोग बेहतर, अधिक सामान्य तरीके से उपयोग करते हैं, तो कृपया बताएं।

धन्यवाद।

+0

आपके पास प्रोटोटाइप पर जेनेरिक सामान क्यों नहीं है? आप इसे आसानी से एक्सेस कर सकते हैं। – Bergi

+0

जावास्क्रिप्ट में कोई शास्त्रीय विरासत नहीं है जैसे आप जावा जैसी अन्य शास्त्रीय भाषाओं से उपयोग किए जाते हैं। आपको प्रोटोटाइप विरासत में पढ़ना चाहिए और शास्त्रीय के लिए इसके मतभेदों के बारे में जानना चाहिए। – Christoph

उत्तर

7

अपने कोड में this answer अनुकूल:

function Entity(x, y) { 

    this.x = x; 
    this.y = y; 

    this.tick = function() { 
     //Do generic stuff 
    } 
} 

function Player(x, y) { 

    this.parent.constructor.call(this, x, y); 

    var oldtick = this.tick; 
    this.tick = function() { 
     //Do player-specific stuff 
     oldtick.call(this); 
    } 
} 

Player.prototype = Object.create(Entity.prototype); 
Player.prototype.constructor = Player; 
Player.prototype.parent = Entity.prototype; 
+0

मुझे संदेह है। हमें इन्हें 'इस' में क्यों पारित करने की आवश्यकता है: 'this.parent.constructor.call (यह, x, y);'। खैर मुझे पता है, यह इस तरह काम करेगा। लेकिन मुझे इसके लिए कोई स्पष्टीकरण नहीं मिला है। –

+0

@ वीरश्रीवास्तव: आपको आवृत्ति पारित करने की आवश्यकता है क्योंकि अन्यथा निर्माता को यह नहीं पता होगा कि इसकी संपत्तियों को कहां स्थापित करना है। – Bergi

4

आपका प्रश्न मेरे चारों ओर देखने के लिए प्रेरित और मैंने पाया कि मैं क्या लगता है a great article by Josh Gertzen इस अवधारणा के बारे में है। कौन सा Player tick और फिर सूचित करेंगे

var Entity = Class.extend({ 
    tick: function() 
    { 
     alert('Entity tick'); 
    } 
}); 

var Player = Entity.extend({ 
    tick: function() 
    { 
     alert('Player tick'); 
     arguments.callee.$.tick.call(this); 
    } 
}); 

p = new Player(); 
p.tick(); 

:

function Class() { } 
Class.prototype.construct = function() {}; 
Class.extend = function(def) 
{ 
    var classDef = function() 
    { 
     if (arguments[0] !== Class) 
     { 
      this.construct.apply(this, arguments); 
     } 
    }; 
    var proto = new this(Class); 
    var superClass = this.prototype; 
    for (var n in def) 
    { 
     var item = def[n];      
     if (item instanceof Function) item.$ = superClass; 
     proto[n] = item; 
    } 
    classDef.prototype = proto; 
    classDef.extend = this.extend;  
    return classDef; 
}; 

अपने मामले जो बाद के रूप में सरल है:

मैं तो एकदम अपने लेख वर्गों पर एक extends विधि स्थापित करने के लिए कुछ कोड से नकल Entity tick

+10

मेरे लिए एक अतिसंवेदनशीलता की तरह दिखता है :-) – Bergi

+0

प्रयास के लिए +1, हालांकि बर्गी उत्तर क्लीनर है। – WTK

+2

यदि यह एप्लिकेशन में एकमात्र सुपरक्लास कॉल है, तो यह निश्चित रूप से एक अतिसंवेदनशीलता है। लेकिन मुझे लगता है कि कोड का दूसरा ब्लॉक अन्य तरीकों से स्पष्ट है। और आपको केवल पहले ब्लॉक को कॉपी-पेस्ट करने की आवश्यकता है और फिर इसके बारे में भूल जाएं; प्रोटोटाइप के बारे में और सोच नहीं :-) – Mark