Maison > interface Web > js tutoriel > Qu'est-ce que le prototype exactement dans les conseils Javascript_javascript

Qu'est-ce que le prototype exactement dans les conseils Javascript_javascript

WBOY
Libérer: 2016-05-16 15:15:11
original
1754 Les gens l'ont consulté

Javascript est également un langage orienté objet, mais il s'agit d'un langage basé sur des prototypes plutôt que sur un langage basé sur des classes. En Javascript, il ne semble pas y avoir beaucoup de différence entre les classes et les objets.

Qu'est-ce qu'un prototype :

L'objet défini par la fonction a un attribut prototype, et l'attribut prototype pointe vers un objet prototype. Notez que l'attribut prototype et l'objet prototype sont deux choses différentes, alors faites attention à la différence. Il existe un autre attribut constructeur dans l'objet prototype. Cet attribut constructeur pointe également vers un objet constructeur, et cet objet constructeur est exactement la fonction elle-même. N'est-ce pas très compliqué ? Exprimé en pseudo code comme suit :

var function{
prototype:prototype{
constructor:constructor == function
}
}
Copier après la connexion

Vous ne comprenez pas encore ? Jetez un œil à la photo :


Le rôle du prototype :

Que fait exactement ce prototype ? Regardez l'exemple ci-dessous :

function jb51(){
}
jb51.prototype.name = "a";
var test = new jb51();
alert(test.name)//"a";
Copier après la connexion

C'est étrange, évidemment l'attribut name n'est pas défini pour le test, mais pourquoi y a-t-il une valeur ?

C'est la contribution de prototype. Le nom de l'objet dans l'attribut prototype dans uw3c est hérité dans l'attribut de l'objet test après la création de uw3c par le nouveau constructeur. Lire ensuite :

var name = "js";
function jb51(name){
alert(this.name);//"css"
}
jb51.prototype.name = "css";
var test = new jb51();
test()
Copier après la connexion

Pourquoi la valeur d'alerte n'est-elle pas « js » ? Le processus est à peu près le suivant :

var test={};
uw3c.call(test);
Copier après la connexion

La première étape consiste à créer un nouvel objet (test).

La deuxième étape consiste à définir l'objet prototype intégré de l'objet (test) sur l'objet prototype référencé par l'attribut prototype du constructeur (c'est-à-dire uw3c).

La troisième étape consiste à appeler le constructeur (c'est-à-dire uw3c) en utilisant l'objet (test) comme paramètre pour terminer le travail d'initialisation tel que le paramétrage des membres.

Un nouveau terme est apparu dans la deuxième étape, qui est l'objet prototype intégré. Notez que ce nouveau terme n'est pas la même chose que l'objet prototype. Pour le distinguer, je l'appelle inobj, et inobj pointe vers l'objet prototype. objet prototype de la fonction uw3c. Toutes les propriétés ou fonctions qui apparaissent dans l'objet prototype de uw3c peuvent être utilisées directement dans l'objet de test. Il s'agit de l'héritage de prototype en JS.

Habituellement, créez un objet comme celui-ci :

function person(name){
this.sayHi = function(){
alert('hi ' + this.name);
}
this.name = name;
}
var p = new person("dan");
p.sayHi(); 
Copier après la connexion

Ci-dessus, utilisez le mot-clé new pour créer une instance d'objet via un objet (les fonctions sont également des objets spéciaux).

Dans les langages basés sur les classes, les attributs ou les champs sont généralement définis à l'avance dans la classe, mais en Javascript, les champs peuvent être ajoutés à la classe après la création de l'objet.

function animal(){}
var cat = new animal();
cat.color = "green"; 
Copier après la connexion

Ci-dessus, le champ de couleur n'appartient qu'à l'instance de chat actuelle.
Pour les champs ajoutés ultérieurement, que se passe-t-il si vous souhaitez que toutes les instances d'animal les aient ?

--使用Prototype
function animal(){}
animal.prototype.color= "green";
var cat = new animal();
var dog = new animal();
console.log(cat.color);//green
console.log(dog.color);//green 
Copier après la connexion

Non seulement des champs peuvent être ajoutés via Prototype, mais des méthodes peuvent également être ajoutées.

function animal(){}
animal.prototype.color= "green";
var cat = new animal();
var dog = new animal();
console.log(cat.color);//green
console.log(dog.color);//green
animal.prototype.run = funciton(){
console.log("run");
}
dog.run(); 
Copier après la connexion

Il s'avère que grâce à l'attribut prototype, vous pouvez également modifier le comportement de l'objet après l'avoir créé.
Par exemple, vous pouvez ajouter une méthode à un objet spécial appelé tableau.

Array.prototype.remove = function(elem){
var index = this.indexof(elem);
if(index >= 0){
this.splice(index, 1);
}
}
var arr = [1, 2, 3] ;
arr.remove(2); 
Copier après la connexion

En plus de définir des propriétés ou des méthodes pour les objets via le prototype, vous pouvez également définir des propriétés ou des méthodes de classe via le constructeur de l'objet.

function animal(){
this.color = "green";
this.run = function(){
console.log("run");
}
}
var mouse = new animal();
mouse.run(); 
Copier après la connexion

L'approche ci-dessus peut également permettre à toutes les instances animales de partager tous les champs et méthodes. Et un autre avantage est que vous pouvez utiliser des variables locales de la classe dans le constructeur.

function animal(){
var runAlready = false;
this.color = "green";
this.run = funciton(){
if(!runAlreadh){
console.log("start running");
} else {
console.log("already running")
}
}
} 
Copier après la connexion

En fait, une approche plus pratique consiste à définir les champs et les comportements d'une classe à travers le constructeur combiné au prototype.

function animal(){
var runAlready = false;
this.run = function(){
if(!runAlready){
console.log('i am running');
} else {
console.log("i am already running");
}
}
}
animal.prototype.color = '';
animal.prototype.hide = funciton(){
console.log("");
}
var horse = new animal();
horse.run();
horse.hide(); 
Copier après la connexion

Le prototype nous permet de modifier le comportement d'un objet ou d'une classe après la création de l'objet, et ces champs ou méthodes ajoutés via l'attribut prototype sont partagés par toutes les instances d'objet.

Étiquettes associées:
source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal