Je ne comprends pas en JavaScript pour utiliser le mot "prototype" vs. Utilisation d'une notation "point" simple sans le mot "prototype". Est-ce que quelqu'un peut regarder ces blocs de code et m'aider à comprendre quand vous voudriez utiliser un sur l'autre?
avec strong> "prototype": p> sans strong> "prototype": p>
6 Réponses :
avec prototype, vous pouvez étendre de manière «nettoyeuse», car vous séparez la logique à l'intérieur de votre fonction de constructeur des propriétés et des méthodes qui définissent votre objet. Cependant, le Ci-dessus sans prototype pourrait ressembler à ceci: p> var Mammal = function() {
this.walk = function() { ... };
};
var Dog = function() {
Mammal.apply(this);
this.bark = function() { ... };
};
Votre exemple ajoutera l'écorce code> méthode code> à mammifère.pototype code>, donc toutes les instances de mammifères code> pourront aboyer, au lieu de toutes les instances de < Code> Chien Code> (Je suppose que vous n'avez que des chiens que des chiens pour pouvoir aboyer).
Je suis aussi un peu confus sur ce qu'est un constructeur. Est-ce le constructeur, var mammifère = fonction () {...}; code>? Si oui, pourquoi n'est-ce pas simplement appelé un "objet"?
@TIMPETERSON Un constructeur est juste une fonction JavaScript régulière, la seule différence est la manière dont elle est invoquée, qui est avec le «nouveau» mot-clé.
Qui soulève la question suivante, quand utiliser le mot, "Nouveau" vs non lorsque vous faites une fonction?
ES5's's's's's's's's ''s> Object.create CODE> supprime presque le besoin de trachant avec Donc, pour ramasser l'exemple de Gerry, vous pouvez aller comme < / p> .pototype code> plus.
Salut Jandy, quelle est la logique derrière cette nouvelle syntaxe?
@TIMPETERSON: En fait, vous pouvez hériter d'objets sans fonctions constructrices, comme indiqué ci-dessus. Vous pouvez toujours utiliser des fonctions de constructeur en combinaison avec objet.create code> bien sûr pour avoir un héritage un peu plus avancé et sophistiqué. Dans generell, objet.create code> créera un nouvel objet et des points que .pototype code> à l'objet que vous transmettez en tant que premier argument, deuxième argument est un objet où vous pouvez créer d'autres. "propre" propriétés. Voir développeur.mozilla.org/fr/javaScript/reference/global_Objects / ...
var chien = s'étend ({}, mammifère, {abc: fonction () {}}) code>
@Raynos: En fait, j'aimerais voir une autre réponse faisant référence à des concepts Pure OC.
@jandy Ce n'est pas vraiment OC, ce n'est que des mixages.
Les baleines n'étaient pas d'accord avec cet exemple.
Le prototype en un mot, le prototype code> objet code> fournit un plan d'un objet "destinataire" - tout ce que vous avez à faire est de pointer le prototype Vous êtes libre de définir les propriétés et les fonctions dans un OBJET DE PROTOTYPE QUI N'EST LES OBJETS DE DÉTENDIATEUR SERA PORTERONT À UTILISER, EG: P> prototype code> est un peu délicat à comprendre; Cependant Cet article sur OOP JavaScript Peut aider à perdre une certaine lumière. du destinataire code> Propriété de votre objet Blueprint. Notez que vous pouvez avoir autant de destinataires d'un objet de plan de prototype que vous le souhaitez (vous pouvez donc indiquer à la fois un objet prototype de véhicule commun). P> function createTrain(whilstleSound) {
// Define the Train's constructor function
function Train(name) {
this.whilstleSound = whilstleSound;
}
// Point the train's prototype at the vechiclePrototype object
Train.prototype = vechiclePrototype;
// Return a new Train instance
return new Train(name);
}
var ic125 = new Train("pooop pooop");
ic125.move();
Les objets JavaScript ont une propriété qui est un pointeur à un autre objet. Ce pointeur est le prototype de l'objet. Instances d'objet Par défaut Partager le même prototype:
function Employee(name){
this.name = name;
}
Employee.prototype.company = "IBM";
Employee.prototype.who = function(){
console.log("My name is", this.name, "I work for", this.company);
}
var bob = new Employee('Bob');
var jim = new Employee('Jim');
// bob and jim are seperate objects, but each is linked to the same 'prototype' object.
jim.who(); // jim doesn't have a property called 'who', so it falls back to it's 'prototype', where who exists
// My name is Jim I work for IBM
bob.who();
// My name is Bob I work for IBM
// Bob leaves IBM for Microsoft
bob.company = "Microsoft"; // bob now has a property called 'company'. The value of which is 'Microsoft', which overrides bob's prototype property of the same name.
bob.who();
// My name is Bob I work for Microsoft
Employee.prototype.company = 'Facebook';
jim.who();
// My name is Jim I work for Facebook
bob.who(); // Bob is not affected by the change.
// My name is Bob I work for Microsoft
delete bob.company;
bob.who(); // bob no longer has it's own property 'company', so like jim, it drops down to the prototype object.
// My name is Bob I work for Facebook
Alors, est-ce analogue à une méthode statique ou une variable?
Ignorer Lorsque vous créez des classes de construction, créez des objets et prolongez-les. P> Nouveau code>, Ignorer .pototype code> Ce sont juste des notions déroutantes. Si vous voulez vraiment une utilisation prototypique d'utilisation de l'héritage objet.create code> mais la plupart de l'héritage de temps est complètement excédentaire. (La héritage prototypique ne doit être utilisée que comme technique d'optimisation). function extend(target) {
[].slice.call(arguments, 1).forEach(function(source) {
Object.getOwnPropertyNames(source).forEach(function (name) {
target[name] = source[name]
})
})
return target
}
Merci Raynos, donc j'ai besoin d'utiliser _. Étendre code> ou $. Emptendre code> en plus de Just étendre code> ou en remplacement du natif > étendre la fonction code>?
@TIMPETERSON Il n'y a pas de fonction Native EXTERRE code>, vous devez utiliser une bibliothèque qui mettent en œuvre. J'ai inliné la mise en œuvre de PD's's étendue.
Les problèmes autour de JS et d'héritage peuvent être complexes, mais la réponse à votre question est relativement simple. Considérez ce code:
function Klass() { }
var obj1 = new Klass();
var obj2 = new Klass();
Salut Mark, merci, je pense que vous avez la réponse la plus directement répond à ma question. Il y a tellement de bonnes réponses, je suis déchiré sur lequel à accepter. Si cela ne vous dérange pas, laissez-moi prendre quelques heures à réfléchir à cela ...
Ajout de membres au prototype code> La propriété de la fonction constructrice est logique si le membre est un procédé - au lieu de définir les méthodes courantes sur chaque instance, vous le mettez simplement dans le prototype et toutes les instances héritent de les hériter.
Si je peux vous suggérer, je marquerais probablement la réponse de @mark de Reed comme correcte, car il l'explique mieux que quiconque. Il est probablement possible de toujours changer la bonne réponse en quelque sorte. Mais c'est juste une suggestion. Merci.