2010-01-16 6 views
3

que je cherchais en faire l'héritage en JavaScript la manière prototypique correcte, selon Douglas Crockford: http://javascript.crockford.com/prototypal.htmlprototypal inheritence - la bonne façon

Il écrit: « Ainsi, au lieu de créer des classes, vous faites des objets prototypes, et puis utilisez la fonction d'objet pour faire de nouvelles instances »

je me suis dit que c'était la façon de le faire:

var objA = { 
    func_a : function() { 
     alert('A'); 
    } 
}; 

var objB = Object.create(objA); 
objB.func_a = function() { 
    alert('B'); 
} 
objB.func_b = function() { 
}; 


var objA_instance1 = Object.create(objA); 
var objA_instance2 = Object.create(objA); 
var objB_instance1 = Object.create(objB); 
var objB_instance2 = Object.create(objB); 
etc... 

Mais ne cela veut dire qu'il ya maintenant quatre cas de func_a (puisqu'il est ISN » t une partie de objA.prototype, c'est j ou est-ce que je ne comprends pas cela correctement?

De même, est-il possible d'atteindre la fonction surchargée d'une fonction (par exemple, appel objA.func_a dans objB.func_a)?

Merci d'avance.

Répondre

2

Vous confondez prototype propriété du constructeur fonctionne avec la propriété interne [[Prototype]] des objets, qui est inaccessible (FF le rend disponible sous la forme __proto__); en utilisant Object.create() définit cette propriété interne à son argument, donc objA et objB seront les prototypes réels de vos objets 'instance', c'est-à-dire qu'aucun objet fonction ne sera dupliqué.

Pour appeler les fonctions surchargées, les accès via par exemple objA.func_a et utiliser call() ou apply() pour les utiliser sur les cas spécifiques, par exemple

objB.func_a = function() { 
    objA.func_a.call(this); // call overridden method with current `this` 
}; 
+0

Merci, en utilisant .call a parfaitement fonctionné! –

+0

[[Prototype]] est accessible par 'Object.getPrototypeOf (object)' bien qu'il ne soit qu'ES5. –

3

Il n'y a qu'une seule instance de func_a, et il est défini sur objA, c'est parce que la méthode de Crockford Object.create utilise cet objet (objA) simplement comme le prototype de nouveaux objets:

console.log(objA_instance1.func_a == objA .func_a); // true 
console.log(objA_instance2.func_a == objA .func_a); // true 

func_a sur vos objA_instances sont atteints par la chaîne prototype, que les objets ne possèdent pas vraiment cette propriété:

console.log(objA_instance1.hasOwnProperty('func_a')); // false 
console.log(objA_instance2.hasOwnProperty('func_a')); // false 
Questions connexes