2009-08-07 8 views
0

J'essaie de générer une classe à partir d'un objet en JavaScript. Par exemple:Génération d'une classe à partir d'un objet (JavaScript)

var Test = { 
    constructor: function() { document.writeln('test 1'); }, 
    method: function() { document.writeln('test 2'); } 
}; 

var TestImpl = function() { }; 
TestImpl.prototype.constructor = Test.constructor; 
TestImpl.prototype.method = Test.method; 

var x = new TestImpl(); 
x.method(); 

Mais cela ne fonctionne pas: ça ne va écrire « test 2 » (pour une raison quelconque, le constructeur n'est pas défini correctement). Pourquoi?

Répondre

0
var Test = function() { 
    document.writeln('test 1'); 
    this.method = function() { document.writeln('test 2'); } 
}; 

var x = new Test(); 
x.method(); 
+0

typo: désaccord de nom entre. Test/TestImpl –

+0

Merci Jason :) –

1

Votre fonction est TestImpl le constructeur. Habituellement, vous devriez faire quelque chose comme ceci:

var Test1 = function() { 
    document.writeln('in constructor'); 
}; 

Test1.prototype = { 
    x: 3, 
    method1: function() { document.writeln('x='+this.x); } 
} 

var y1 = new Test1(); 
y1.method1(); 
y1.x = 37; 
y1.method1(); 

var y2 = new Test1(); 
y2.method1(); 
y2.x = 64; 
y2.method1(); 

Je pense que vous avez un peu de recul. Habituellement, vous allez assigner un prototype à un constructeur, plutôt que d'assigner un constructeur à un prototype. La raison de l'affectation d'une méthode au prototype du constructeur, plutôt qu'à l'objet "this" dans le constructeur, est que la première méthode crée seulement 1 fonction partagée, alors que la dernière méthode crée des instances séparées d'une fonction. Ceci est important (pour que l'allocation de mémoire reste raisonnable) si vous créez beaucoup d'objets avec beaucoup de méthodes.

1

Je pense que vous le faites mal.

Rappelez-vous, JavaScript n'a pas de cours du tout. Il a des prototypes à la place. Donc, ce que vous essayez vraiment de faire est de créer un objet prototype qui fonctionne comme une collection de fonctions que vous avez construites sur un autre objet. Je ne peux imaginer aucun but utile pour cela - pourriez-vous élaborer sur ce que vous essayez de faire?

Bien que je pense que vous pouvez le faire fonctionner en utilisant quelque chose comme:

var TestImpl = function() { 
    Test.constructor.apply(this); 
}; 
TestImpl.prototype.method = Test.method; 
0

Javascript ne dispose pas d'un concept de « classe », il est tout au sujet de prototype et la façon dont vous les utilisez [et vous pouvez simuler tout type d'héritage avec cette petite fonctionnalité soignée. ] En javascript "Fonction" joue le rôle de [Classe, Méthode et Constructeur]. Afin de créer un comportement "Classe" en Javascript, tout ce que vous devez faire est d'utiliser la puissance de "Fonction".

var A = function(){ 
    alert('A.Constructor'); 
} 

A.prototype = { 
    method : function(){ 
     alert('A.Method'); 
    } 
} 

var b = new A(); // alert('A.Constructor'); 
b.method(); // alert('A.Method'); 

maintenant la chose intéressante à propos de JS est que vous pouvez facilement créer un comportement « d'héritage » en utilisant la même méthode. Tout ce que vous avez à faire est de connecter la deuxième chaîne "Prototype Chain" à la première, Comment?

B = function(){ 
this.prototype = new A(); // Connect "B"'s protoype to A's 
} 
B.prototype.newMethod = function() { alert('testing'); } 

var b = new B(); 

b.method(); // Doesn't find it in B's prototype, 
       // goes up the chain to A's prototype 

b.newMethod(); // Cool already in B's prototype 

// Now when you change A, B's class would automatically change too 
A.prototype.method = function(){ alert('bleh'); } 
b.method(); // alert('bleh') 

Si vous avez besoin de références, je suggère de jeter un oeil à Douglas Crockford's Site ing Bonne JS.

Questions connexes