Il y a en fait deux types différents de « prototype » en JavaScript:
- One est le lien « caché » chaque objet a (nous allons utiliser
[[Prototype]]
pour représenter ce lien caché). Les objets littéraux par défaut ont leurs liens cachés pointant vers Object.prototype
, les objets fonction ont leur lien caché pointant vers Function.prototype
, et les tableaux pointent vers Array.prototype
. Ces les prototypes de liens cachés ne sont pas associés aux propriétés avec le nom "prototype". Vous ne pouvez pas modifier ces liens cachés en ajoutant ou en modifiant o.prototype
.
- Un autre est que tous les objets de fonction ont automatiquement une propriété spéciale nommée "
prototype
". Ceci est principalement pour l'utilisation du modèle d'invocation de constructeur.
[[Prototype]]
est utilisé pour la recherche des propriétés (comme le parent dans la hiérarchie classique), à chaque fois qu'une propriété ne peut être trouvée dans un objet, son [[Prototype]]
est recherché à la place.Un scénario d'utilisation: dites que vous souhaitez ajouter une propriété à tous les objets, vous pouvez simplement l'ajouter à Object.prototype
qui s'appliquerait automatiquement à tous les objets puisque tous les objets ont Object.prototype
comme racine de chaîne [[Prototype]]
. Revenons à la propriété "prototype
" des objets de fonction. Ce n'est utile que lorsqu'il est utilisé avec l'opérateur new
. Prenez l'extrait de code suivant comme exemple:
function F() {} // function declaration
// F now has a property named "prototype"
var f = new F(); // use "new" operator to create a new function object based on F
Qu'est-ce que new F()
ci-dessus est d'abord créer un nouvel objet de fonctions, définissez le [[Prototype]]
(lien caché) de cet objet fonction nouvellement créé pour être F.prototype
, puis retourner la nouvel objet de fonction. C'est probablement ce que vous comprenez déjà qui fonctionne pour les objets de fonction. Rappelez-vous que j'ai dit que nous ne pouvons pas changer les objets de [[Prototype]]
? Eh bien, au moins pas directement. La fonction Object.create
de Crockford ne fait que cela, en utilisant le fait que l'opérateur new
pourrait aider à définir [[Prototype]]
pour nous. Ainsi, en utilisant Object.create
, vous indiquez délibérément où le lien caché de votre nouvel objet doit pointer. (un peu comme indiquer qui est votre classe parent)
Dans votre exemple, conf
est un objet littéral et conf.prototype
n'est pas vraiment utile. Voici une autre version utilisant un style classique:
function ConfBase() {}
ConfBase.prototype.d = 16;
var conf = new ConfBase();
conf.a = 2;
conf.b = 4;
document.writeln(conf.a);
document.writeln(conf.b);
document.writeln(conf.d);
par rapport à la réponse de @CMS, je préfère utiliser Object.create
. Mais essentiellement les 2 styles utilisent le même mécanisme sous-jacent, juste que Object.create
aide à le ranger.
Pourriez être le descendant s'il vous plaît laisser un commentaire? Je cherche toujours à améliorer mes réponses :) – CMS