2010-09-25 2 views
0

J'expérimentais avec l'héritage en javascript, et écrit ces deux fonctions:Comment un objet se réfère-t-il en Javascript?

Object.prototype.inherits=function(obj){this.prototype=new obj;} 
Object.prototype.pass=function(obj){obj.prototype=new this;} 

Ce code fonctionne très bien:

Dog.inherits(Animal); 

Mais la tombe en panne suivant:

Animal.pass(Dog); 

Comme je l'ai le comprendre, mes fonctions de passe ne fonctionnent pas, car "ceci" n'est pas une référence à l'instance de l'objet elle-même? Si c'est le cas, comment puis-je référencer l'objet de l'intérieur de lui-même?

Merci d'avance!

Répondre

1

Eh bien, en fait les deux sont en train de faire exactement la même chose:

Dog.prototype = new Animal; 

La valeur this à l'intérieur des méthodes fera référence à l'objet de base où la référence a été invoqué, dans le cas de:

Dog.inherits(Animal); 

la valeur this fera référence à la fonction constructeur Dog, et l'argument obj sera le plaisir Animal ction.

Lorsque vous appelez:

Animal.pass(Dog); 

La valeur this fera référence à la fonction Animal, faire à la fin exactement la même chose que la méthode inherits, mais l'inverse.

Je vous recommande de pas étendre l'objet Object.prototype, car il peut vous causer beaucoup de problèmes, par exemple ces deux propriétés seront énumérées dans une boucle for-in, par exemple:

for (var prop in {}) { // <-- an empty object! 
    alert(prop); // will alert 'inherits' and 'pass' 
} 

Tous Les objets héritent de Object.prototype et il semble que vous ayez l'intention d'utiliser ces méthodes uniquement sur les objets Function. Il serait plus sûr d'étendre l'objet Function.prototype ou d'implémenter les méthodes en tant que fonctions prenant deux paramètres.

+0

Oui, les deux fonctions fonctionnent bien, je suppose que j'ai fait une erreur quand je l'ai testé ... Merci pour le conseil. – Alex

1

Works pour moi, avec le code de test comme:

function Animal() {} 
Animal.prototype.isanimal= 1; 
function Dog() {} 
Animal.pass(Dog); 
Dog.prototype.isdog= 2; 
alert(new Dog().isanimal); // 1 
alert(new Dog().isdog); // 2 

Cependant, gardez à l'esprit que new this ou new obj appellera la fonction this/obj, la création d'une nouvelle instance complète. Si vous avez du code constructeur dans cette fonction qui s'attend à recevoir des arguments ou à définir un état d'instance, vous pouvez vous retrouver avec des problèmes. Pour créer une nouvelle this sans appeler this en fonction, vous pouvez utiliser un constructeur différent qui ne fait rien:

function nonconstructor() {} 
nonconstructor.prototype= this.prototype; 
obj.prototype= new nonconstructor(); 

En outre, vous devriez éviter le prototypage sur Object. Cela provoquera des problèmes pour le code en utilisant Object comme une carte de recherche à usage général.Comme vous semblez seulement travailler avec des fonctions constructeur, le prototypage sur Function devrait répondre à vos besoins et est beaucoup plus sûr.

+0

N'a pas été au courant de ce problème (potentiel), merci! – Alex

Questions connexes