2015-08-21 1 views
1

Je suis novice en Javascript je suis en train d'ajouter une fonction dans le prototype d'objet qui est créé par Object.prototype j'ai essayé ce codeAjout fonction objet en utilisant Javascript prototype

var a=function(){this.k="yes";} 
a.prototype.b1=function(){console.log("function of a");}; 
var b=Object.create(a.prototype); 
b.prototype.c1=function(){console.log("function of b");}; 
b.c1(); 

Son me donner une erreur « Impossible de définir propriété 'c1' de non défini 'Je ne suis pas en train de me tromper si je me trompe. Merci à l'avance

+2

est-ce l'erreur que vous obtenez? parce que je reçois ce prototype n'existe pas (sur 'b') aussi, vous ne pouvez pas faire' var bObj = new b() ', car b n'est pas un constructeur. – atmd

+1

@atmd yep, sry, n'a pas remarqué que b n'est pas un constructeur. – fuyushimoya

+0

Vous oubliez l'étape où 'b' est une fonction qui crée des instances et a un' .prototype' ... – Bergi

Répondre

2

Je ne sais pas exactement ce que vous étiez essayer de faire, mais actuellement votre problème est que b est un objet ordinaire (qui hérite de a.prototype qui a .b1 et propriétés .constructor) sans propriété b.prototype. Néanmoins, vous essayez de définir une propriété sur cette chose inexistante.

Soit vous recherchez

var a = { 
    b1: function(){console.log("function of a");} 
}; 
var b = Object.create(a); 
b.c1 = function(){console.log("function of b");}; 
b.c1(); 
b.b1(); 

sans fonctions constructeur ou .prototype propriétés impliqué - tout héritage prototype simple - ou que vous cherchiez

function A() { this.k="yes"; } 
A.prototype.b1 = function(){console.log("function of A.prototype");}; 

function B() { A.call(this); } 
B.prototype = Object.create(a.prototype); 
B.prototype.c1 = function(){console.log("function of B.prototype");}; 
var b = new B(); 
b.c1(); 
b.b1(); 

qui est un exemple typique de l'héritage entre les structures "class", c'est-à-dire les constructeurs avec des objets prototypes associés. Vous avez oublié de créer une fonction B et de l'instancier avant d'appeler une méthode.

+0

Super ... ça m'a vraiment ouvert les yeux –

0

Votre code devrait ressembler à ceci:

var a=function(){this.k="yes";}; 
 
a.prototype.b1=function(){console.log("function of a");}; 
 
var b =function(){}; 
 
b.prototype=new a(); 
 
b.prototype.c1=function(){console.log("function of b");}; 
 
var bObj = new b(); 
 
bObj.c1()

+0

[Pas exactement, non] (https://stackoverflow.com/questions/12592913/what-is-the- reason-to-use-the-new-keyword-here) – Bergi

0

Vous essayez de réaliser deux choses séparées ici.

Première:

var b=Object.create(a.prototype); 

Je suppose que vous essayez d'étendre a classe b. Envisager de modifier directement le prototype b après vous l'avez créé:

//Create b class 
var b = function(){this.key = 2}; 

//Extends a in b 
var b.prototype = new a(); 

Deuxième:

b.prototype.c1=function(){console.log("function of b");}; 
b.c1(); 

Vous essayez d'appeler votre fonction de votre classe avec b.c1();. Essayez de instancier d'abord dans une autre variable var bObject = new b(); puis appeler la fonction assignée à te prototype: bObject.c1()

Votre code global devrait ressembler à ceci:

//Create a class here 
var a=function(){this.k="yes";}; 

//assign b1 function to a class 
a.prototype.b1=function(){console.log("function of a");}; 

//Create b class 
var b = function(){this.key = 2}; 

//extends a in b 
b.prototype = new a(); 

//create c1 function in b class 
b.prototype.c1=function(){console.log("function of b");}; 

//create bObj from b class 
var bObj = new b(); 

//call c1 function defined in b class 
bObj.c1(); 

//can also call b1 function from a class 
bObj.b1(); 
+0

Non, [il ne faut * pas *] (https: // stackoverflow.com/questions/12592913/quoi-est-la-raison-d'utiliser-le-nouveau-mot-clé-ici) ressemble à 'b.prototype = new a();' – Bergi

+0

Btw, vous avez oublié une fonction 'b' et votre déclaration 'var b.prototype' est également invalide. – Bergi

+0

Merci @Bergi pour le lien. J'apprends quelque chose ici. Je suis en train d'éditer pour ton deuxième commentaire – FaXaq