2012-07-22 3 views
1

J'ai deux fichiers: BaseClass.js et DerivedClass.js. Contenu comme ci-dessousFermetures Javascript et héritage

//---------------------BaseClass.js---------------------------- 

(function() { 
    BaseClass= function() { }; 
    BaseClass.prototype.getTestVar = function() { 
    return 'base test variable'; 
    }; 
})(); 


//----------------DerivedClass.js---------------------------- 

(function() { 
    DerivedClass= function() { }; 
    DerivedClass.inherits(BaseClass); 
    DerivedClass.prototype = new BaseClass(); 
    DerivedClass.prototype = { 
     newvar : 'derived func variable ', 
     getNewVar : function() { return this.newvar; } 
    }; 
})(); 

Dans mon fichier html 'test.html Je donne les résultats suivants

var dc = new DerivedClass(); 
alert(
    'The value in newvar of derived class ' + dc.getNewVar() + 
    ' base class variable ' + dc.getTestVar() 
); 

je reçois l'erreur Javascript que dc.getTestVar() n'est pas une fonction. Toute aide pour résoudre ce problème est très appréciée.

+2

Utilisez-vous une sorte de bibliothèque de POO? Les fonctions Javascript n'ont pas de méthode 'inherits' intégrée, à ma connaissance ... – Matchu

+0

Oh, c'est [le sucre OOP de Crockford] (http://www.crockford.com/javascript/inheritance.html#sugar)? – Matchu

Répondre

2

Découvrez ces quelques lignes:

DerivedClass.prototype = new BaseClass(); 
DerivedClass.prototype = { 
    newvar : 'derived func variable ', 
    getNewVar : function() { return this.newvar; } 
}; 

D'abord, il attribue un nouveau BaseClass comme le prototype, mais la ligne suivante Ecrase ce prototype avec un nouvel objet. Vous devez peut-être affecter DerivedClass.prototype.newvar et DerivedClass.prototype.getNewVar séparément - en supposant que cela corresponde à la bibliothèque d'héritage classique que vous utilisez qui fournit la méthode inherits.

C'est,

DerivedClass.prototype = new BaseClass(); 
DerivedClass.prototype.newvar = 'derived func variable'; 
DerivedClass.prototype.getNewVar = function() { return this.newvar; } 

Pourtant, cela semble être un mélange de l'héritage classique et prototypal. Pensez à lire sur la documentation de cette bibliothèque d'héritage classique et voyez s'il y a une façon plus cohérente de faire ce genre de chose.

Par exemple, si vous utilisez Crockford's classical inheritance (une estimation du mot-clé inherits), cela semble être le chemin destiné à déclarer une méthode:

DerivedClass.method('getNewVar', function() { return this.newvar }); 

Accordé, c'est exactement équivalent à ce que vous le faites déjà, mais, si nous allons utiliser sa bibliothèque, nous pouvons aussi bien utiliser son style pour la cohérence.

+0

J'ai répondu exactement la même chose exactement au même moment. Que l'homme le plus chanceux gagne! – Hubro

+0

Haha, SO est drôle de cette façon;) +1 pour vous aider à démarrer! – Matchu

+1

Genre de vous :-) J'attends avec impatience mon 5000. +1 – Hubro

2

A ce moment:

DerivedClass.prototype = new BaseClass(); 
DerivedClass.prototype = { 
    newvar : 'derived func variable ', 
    getNewVar : function() { return this.newvar; } 
}; 

Vous êtes le premier prototype à mettre le l'BaseClass, mais avec un écrasant nouvel objet. Essayez ceci à la place:

DerivedClass.prototype = new BaseClass(); 
DerivedClass.prototype.newvar = 'derived func variable '; 
DerivedClass.prototype.getNewVar = function() { return this.newvar; };