SOO : Orienté objet JavaTutoriel de script avec exemple

⚡ Résumé intelligent

Orienté objet JavaScript modélise les entités du monde réel comme des objets dotés de propriétés et de méthodes. Cette page explique les littéraux d'objet, les fonctions constructeurs, les prototypes, les classes ES6, l'héritage et les champs privés, avec des exemples exécutables que vous pouvez vérifier.

  • 🧱 Objets: Un objet regroupe des propriétés et des méthodes apparentées, de sorte qu'une seule variable puisse représenter un étudiant, un compte ou un logement.
  • ???? Constructeurs: Une fonction constructeur avec ceci. crée de nombreuses instances à partir d'un seul modèle réutilisable.
  • (I.e. Énumération: La boucle for/in parcourt chaque propriété énumérable, en affichant les clés et les valeurs sans coder en dur les noms.
  • 📦 Classes ES6 : Le mot-clé « class » est un sucre syntaxique ; les méthodes résident toujours dans l'objet prototype partagé.
  • 🧬 héritage: étend automatiquement les prototypes de liens et appelle le constructeur parent ou une méthode surchargée.
  • (I.e. Encapsulation: Les champs préfixés par # restent privés et sont masqués par Object.keys et JSON.stringify.
  • ⚙️ Pratique: Chaque exemple présenté sur cette page affiche un résultat vérifié, ce qui vous permet de comparer les résultats au fur et à mesure de votre apprentissage.

Orienté objet JavaConcepts de programmation orientée objet (OOJS) avec objets, constructeurs et classes

Qu’est-ce que le concept OOPS dans JavaScénario?

Souvent, les variables ou les tableaux ne suffisent pas pour simuler des situations réelles. JavaScript vous permet de créer des objets qui se comportent comme des objets réels. Un étudiant ou une maison peuvent être des objets possédant de nombreuses caractéristiques uniques. Vous pouvez définir des propriétés et des méthodes pour vos objets afin de simplifier la programmation. Si votre objet est un étudiant, il aura des propriétés telles que le prénom, le nom et l'identifiant, ainsi que des méthodes comme calculer le rang ou changer l'adresse. Si votre objet est une maison, il aura des propriétés telles que le nombre de pièces, la couleur de la peinture et l'emplacement, ainsi que des méthodes comme calculer la surface ou changer le propriétaire.

Programmation orientée objet en JavaLe scénario repose donc sur quatre idées que vous découvrirez sur cette page : groupeping Intégrer l'état et le comportement dans un objet, réutiliser un modèle via un constructeur, partager des méthodes via le prototype et restreindre l'accès direct aux données internes. Si vous débutez avec ce langage, commencez par ceci. introduction à Javascénario puis revenez ici.

Comment créer un objet

Vous pouvez créer un objet comme ceci :

var objName = new Object();
objName.property1 = value1;
objName.property2 = value2;
objName.method1 = function()
{
  // line of code
}

OU, en utilisant la forme littérale de l'objet plus courte :

var objName = { property1: value1, property2: value2, method1: function()
{
  // lines of code
} };

Accéder aux propriétés et méthodes des objets

Vous pouvez accéder à une propriété d'un objet en utilisant la notation pointée, et vous pouvez appeler une méthode en ajoutant des parenthèses :

objectname.propertyname;   // read a property
objectname.methodname();   // call a method
objectname["propertyname"]; // bracket notation, useful for dynamic keys

Essayez cet exemple vous-même :

<html>
<head>
	<title>Objects!!!</title>
	<script type="text/javascript">
      var student = new Object();
      student.fName = "John";
      student.lName = "Smith";
      student.id = 5;
      student.markE = 76;
      student.markM = 99;
      student.markS = 87;
      student.calculateAverage = function()
      {
      	return (student.markE + student.markM + student.markS)/3;
      };
      student.displayDetails = function()
      {
        document.write("Student Id: " + student.id + "<br />");
        document.write("Name: " + student.fName + " " + student.lName + "<br />");
        var avg = student.calculateAverage();
        document.write("Average Marks: " + avg);
      };
		student.displayDetails();
	</script>
</head>
<body>
</body>
</html>

Sortie :

Student Id: 5
Name: John Smith
Average Marks: 87.33333333333333

Astuce : L'exemple ci-dessus utilise document.écrire car il s'exécute dans l'éditeur de cette page. Dans les projets réels, il est préférable de… console.log pour le débogage ou les méthodes DOM telles que texteContenu, Parce document.écrire Efface la page lorsqu'elle est appelée après la fin du chargement.

Constructeur OUPS

Créer des objets un par un n'est pas très utile, car il faudrait répéter le même code pour chaque étudiant. C'est là qu'intervient le constructeur d'objet. Un constructeur est une fonction ordinaire appelée avec le constructeur. New mot-clé ; il définit un type d’objet qui peut être réutilisé pour chaque instance individuelle.

À l'intérieur d'un constructeur, ceci. fait référence au nouvel objet en cours de création, de sorte que chaque instance reçoit sa propre copie des valeurs transmises. Les valeurs associées, telles que les marques, sont souvent stockées dans un tableau afin qu'ils puissent être totalisés en une seule opération.

Essayez cet exemple vous-même :

<html>
<head>
	<script type="text/javascript">
		function Student(first, last, id, english, maths, science)
        {
          this.fName = first;
          this.lName = last;
          this.id = id;
          this.markE = english;
          this.markM = maths;
          this.markS = science;
          this.calculateAverage = function()
          {
         	 return (this.markE + this.markM + this.markS)/3;
          }
		  this.displayDetails = function()
		  {
            document.write("Student Id: " + this.id + "<br />");
            document.write("Name: " + this.fName + " " + this.lName + "<br />");
            var avg = this.calculateAverage();
            document.write("Average Marks: " + avg + "<br /><br />");
		  }
		}
        var st1 = new Student("John", "Smith", 15, 85, 79, 90);
        var st2 = new Student("Hannah", "Turner", 23, 75, 80, 82);
        var st3 = new Student("Kevin", "White", 4, 93, 89, 90);
        var st4 = new Student("Rose", "Taylor", 11, 55, 63, 45);
        st1.displayDetails();
        st2.displayDetails();
        st3.displayDetails();
        st4.displayDetails();
	</script>
</head>
<body>
</body>
</html>

Sortie :

Student Id: 15
Name: John Smith
Average Marks: 84.66666666666667

Student Id: 23
Name: Hannah Turner
Average Marks: 79

Student Id: 4
Name: Kevin White
Average Marks: 90.66666666666667

Student Id: 11
Name: Rose Taylor
Average Marks: 54.333333333333336

Parcourez les propriétés d'un objet

syntaxe:

for (variablename in objectname)
{
  // lines of code to be executed
}

Le pour/dans boucle est généralement utilisé pour parcourir les propriétés d'un objet. Vous pouvez donner n'importe quel nom à la variablemais le nom de l'objet doit correspondre à un objet existant. À chaque itération, la variable contient la propriété clé sous forme de chaîne de caractères, la valeur est donc lue avec une notation entre crochets, comme ceci : employé[x].

Essayez cet exemple vous-même :

<html>
<head>
	<script type="text/javascript">
		var employee={first:"John", last:"Doe", department:"Accounts"};
        var details = "";
        document.write("<b>Using for/in loops </b><br />");
        for (var x in employee)
        {
          details = x + ": " + employee[x];
          document.write(details + "<br />");
        }
	</script>
</head>
<body>
</body>
</html>

Sortie :

Using for/in loops
first: John
last: Doe
department: Accounts

Deux points sont à retenir. Une boucle for/in parcourt également les propriétés énumérables héritées par la chaîne de prototypes ; une garde telle que Objet.prototype.hasOwnProperty.call(employé, x) est souvent ajouté. Pour les objets de données simples, Objet.clés(employé) or Objet.entrées(employé) est généralement plus clair, car les deux ne renvoient que les propriétés propres à l'objet.

Quelle est la syntaxe des classes ES6 ? JavaScénario?

ECMAScript 2015, communément appelé ES6, a ajouté les classe Mot-clé. Une classe est un sucre syntaxique par rapport au système de prototypes déjà utilisé par la fonction constructeur ci-dessus : aucun nouveau modèle objet n'a été introduit. Exécution type d'étudiant sur une classe renvoie toujours la chaîne « fonction », et chaque méthode écrite dans le corps de la classe est installée sur Étudiant.prototypece qui signifie que toutes les instances partagent une seule copie de cette méthode au lieu que chaque objet possède la sienne.

La syntaxe gomme également certaines aspérités. Les corps de classe s'exécutent toujours en mode strict, appelant une classe sans New Au lieu de polluer silencieusement l'objet global, une exception TypeError est levée, et les accesseurs, mutateurs et membres statiques disposent d'un emplacement dédié. Il en résulte un code plus court qui exprime la même intention.

class Student {
  constructor(first, last, id, english, maths, science) {
    this.fName = first;
    this.lName = last;
    this.id = id;
    this.marks = [english, maths, science];
  }

  calculateAverage() {
    const total = this.marks.reduce((sum, m) => sum + m, 0);
    return total / this.marks.length;
  }

  displayDetails() {
    console.log("Student Id: " + this.id);
    console.log("Name: " + this.fName + " " + this.lName);
    console.log("Average Marks: " + this.calculateAverage().toFixed(2));
  }
}

const st1 = new Student("John", "Smith", 15, 85, 79, 90);
st1.displayDetails();
console.log(typeof Student);
console.log(st1.calculateAverage === Student.prototype.calculateAverage);

Sortie :

Student Id: 15
Name: John Smith
Average Marks: 84.67
function
true

Les deux dernières lignes le prouvent : la classe est toujours une fonction, et la méthode sur l'instance est exactement le même objet fonction stocké dans le prototype.

Fonction constructeur vs classe ES6

Aspect Fonction constructeur Classe ES6
Déclaration fonction Étudiant(…) { } classe Étudiant { constructeur(…) { } }
Placement de la méthode Attribuée à l'intérieur de la fonction, chaque instance reçoit donc sa propre copie, sauf si vous écrivez dans Étudiant.prototype Inscrit dans le corps de la classe et placé automatiquement sur le prototype.
Appeler sans nouveau Fonctionne silencieusement et ceci. est indéfini ou l'objet global Lève immédiatement une erreur TypeError
Levage Les déclarations de fonctions sont remontées et utilisables avant la définition. Dans la zone morte temporelle jusqu'à évaluation
Mode strict Suit le script environnant Toujours strict
Droit des successions Manuel: Objet.créer ainsi qu'un nous appeler au parent S'étend et super
Données privées Fermetures ou convention de nommage telle que _équilibre De véritables champs privés avec #
Modèle sous-jacent Prototypes Prototypes (identiques à l'exécution)

Comment implémenter l'héritage avec extends et super

L'héritage permet à un type spécialisé de réutiliser les propriétés et les méthodes d'un type plus général. Avant ES6, cela impliquait de configurer manuellement la chaîne de prototypes en trois étapes distinctes, et il était facile d'en oublier une.

function Person(fName, lName) {
  this.fName = fName;
  this.lName = lName;
}

Person.prototype.introduce = function () {
  return "I am " + this.fName + " " + this.lName;
};

function Student(fName, lName, id) {
  Person.call(this, fName, lName);   // 1. borrow the parent constructor
  this.id = id;
}

Student.prototype = Object.create(Person.prototype); // 2. link the chain
Student.prototype.constructor = Student;              // 3. repair constructor

var st = new Student("Kevin", "White", 4);
console.log(st.introduce());
console.log(st instanceof Person);

Sortie :

I am Kevin White
true

Le S'étend Le mot-clé effectue les trois étapes pour vous, et super offre un moyen simple d'atteindre le parent. Il existe deux utilisations distinctes de super:

  • super(…) comme appel exécute le constructeur parent. Il n'est valide qu'à l'intérieur d'un constructeur dérivé et doit être exécuté avant que vous ne touchiez ceci., sinon une erreur de référence est levée.
  • super.méthode() La recherche de propriété invoque la version parente d'une méthode que l'enfant a redéfinie, ce qui permet d'étendre un comportement au lieu de le remplacer.
class Person {
  constructor(fName, lName) {
    this.fName = fName;
    this.lName = lName;
  }

  introduce() {
    return "I am " + this.fName + " " + this.lName;
  }
}

class Student extends Person {
  constructor(fName, lName, id) {
    super(fName, lName);   // must run before "this" is used
    this.id = id;
  }

  introduce() {
    return super.introduce() + ", roll number " + this.id;
  }
}

const st = new Student("Hannah", "Turner", 23);
console.log(st.introduce());
console.log(st instanceof Student, st instanceof Person);
console.log(Object.getPrototypeOf(Student.prototype) === Person.prototype);

Sortie :

I am Hannah Turner, roll number 23
true true
true

La troisième ligne est la plus importante. Elle confirme que S'étend Le produit reproduisait exactement le lien prototype de la version manuelle construite à la main ; les classes ne remplaçaient donc pas l’enchaînement de prototypes. Elles masquaient simplement le code répétitif. Lorsqu’une propriété est lue à partir de stLe moteur examine l'instance, puis Étudiant.prototype, puis Personne.prototype, puis Objet.prototype, et s'arrête à la première correspondance ; ce chemin de recherche constitue la chaîne prototype.

⚠️ Attention : Ne jamais assigner Étudiant.prototype = Personne.prototypeCela permet aux deux types de partager un seul objet ; ainsi, toute méthode ajoutée à l’enfant est également ajoutée au parent. Objet.créer(Personne.prototype), ou utilisez simplement S'étend.

Comment réaliser l'encapsulation avec des champs de classe privés

L'encapsulation signifie garderping Un état interne hors de portée, ne pouvant être modifié que par des méthodes que vous contrôlez. Depuis des années. JavaLes développeurs de scripts ont simulé cela avec un trait de soulignement initial, mais un nom tel que _équilibre Il ne s'agit que d'une convention et n'importe quel code peut la remplacer. Moderne JavaScript offre une véritable confidentialité : un champ dont le nom commence par # n'est accessible que depuis le corps de la classe qui la déclare.

Les terrains privés présentent trois avantages concrets :

  • Elles doivent être déclarées dans le corps de la classe avant utilisation, ce qui documente l'état interne du type en un seul endroit.
  • Ils sont invisibles à Objet.clés, JSON.stringify, et pour/dans, afin que l'état interne ne soit pas divulgué dans la sortie sérialisée.
  • Modifier un champ privé depuis l'extérieur de la classe constitue une erreur de syntaxe, détectée avant même l'exécution du code, et non un bogue silencieux.
class BankAccount {
  #balance = 0;

  constructor(owner, opening) {
    this.owner = owner;
    this.#balance = opening;
  }

  deposit(amount) {
    if (amount <= 0) {
      return "Deposit must be positive";
    }
    this.#balance += amount;
    return this.owner + " balance: " + this.#balance;
  }

  get balance() {
    return this.#balance;
  }
}

const acc = new BankAccount("John", 500);
console.log(acc.deposit(250));
console.log(acc.deposit(-40));
console.log("Read via getter: " + acc.balance);
console.log("Own keys: " + Object.keys(acc));
console.log("JSON: " + JSON.stringify(acc));

Sortie :

John balance: 750
Deposit must be positive
Read via getter: 750
Own keys: owner
JSON: {"owner":"John"}

L'équilibre n'apparaît jamais dans Objet.clés ou dans la chaîne JSON, et le dépôt négatif est rejeté par la méthode au lieu de corrompre le champ. obtenir le solde() L'accesseur expose une vue en lecture seule, ce qui est la méthode habituelle pour publier un état privé en toute sécurité.

Maintenant que les concepts d'objets, de prototypes, de classes, d'héritage et d'encapsulation sont clairs, continuez à développer. Entraînez-vous à maîtriser les fondamentaux avec ces exemples. pratique JavaExemples de code de script, travaillez à travers Interactif JavaExercices de scénario, appliquer des classes à des algorithmes tels que tri rapide dans Javascénario, nettoyer la sortie en utilisant Javaformatage des chaînes de scriptet voyez comment statique typing modifications de la conception des objets dans TypeScript.

FAQ

Elle crée un objet vide, le lie au prototype du constructeur, exécute ce dernier en liant l'objet à l'objet « this », puis le retourne. Si le constructeur retourne explicitement un objet, c'est cette valeur qui est retournée.

Utilisez une méthode statique lorsque la logique appartient au type plutôt qu'à une instance particulière, comme par exemple une fabrique qui construit un objet à partir de JSON ou une fonction utilitaire qui compare deux instances. Les membres statiques sont appelés sur la classe elle-même.

En effet, la valeur de « this » dépend de la manière dont la méthode est appelée, et non de son emplacement. Passer une méthode comme fonction de rappel entraîne la perte du destinataire. Pour y remédier, liez la méthode dans le constructeur ou déclarez-la comme champ de classe via une fonction fléchée.

Non. Déclarer deux méthodes portant le même nom ne conserve que la dernière. Simulez la surcharge en examinant la longueur des arguments, en utilisant des valeurs de paramètres par défaut ou en acceptant un objet d'options unique avec des propriétés nommées.

Oui. Les assistants de programmation IA gèrent bien cette refactorisation car la carteping C'est mécanique. Vérifiez toujours le résultat, car les assistants peuvent manquer des méthodes attachées au prototype en dehors du constructeur ou omettre un appel au constructeur parent.

Oui. Le code généré doit toujours être lu, examiné et débogué. Comprendre le fonctionnement des prototypes, de l'opérateur « this » et des champs privés permet de repérer une suggestion erronée avant sa mise en production.

Résumez cet article avec :