Heim >Web-Frontend >js-Tutorial >JavaScript-OOP-Konzepte: klassenbasiert vs. prototypbasiert
Um einen ausführlichen Blog über die Konzepte und Prototypen der objektorientierten Programmierung (OOP) von JavaScript zu schreiben, gehen wir zunächst erstklassige Funktionen, durch -Klasseninstanzen, Vererbung, Polymorphismus, Kapselung und Abstraktion, wobei beides klassenbasiert und prototypbasierte Ansätze.
klassenbasiertes OOP (eingeführt in ES6) als auch prototypbasiertes OOP (die ursprüngliche Art und Weise, wie JavaScript mit OOP umgegangen ist) unterstützen kann. Dieser Blog befasst sich mit wichtigen OOP-Konzepten wie Erstklassige Funktionen, Erstklassige Instanzen, Vererbung, Polymorphismus, Kapselung und Abstraktion unter Verwendung beider Ansätze.
erstklassige Bürger. Dies bedeutet, dass Funktionen sein können:
erstklassige Funktionen als auch erstklassige Instanzen abzudecken und dabei sowohl funktionale als auch klassenbasierte Ansätze in JavaScript zu verwenden. Dadurch erhalten Sie ein klares Verständnis dieser Konzepte im Kontext der objektorientierten Programmierung (OOP).
// Assigning a function to a variable const greet = function(name) { return `Hello, ${name}!`; }; // Passing a function as an argument function logGreeting(fn, name) { console.log(fn(name)); } // Returning a function function createMultiplier(multiplier) { return function(number) { return number * multiplier; }; } logGreeting(greet, "John"); // Output: Hello, John! const double = createMultiplier(2); console.log(double(5)); // Output: 10
Erklärung:
Beispiel: Erstklassige Funktionen im Klassenkontext
class Greeter { constructor(name) { this.name = name; } greet() { return `Hello, ${this.name}!`; } } // Logging greeting class Logger { static logGreeting(greeter) { console.log(greeter.greet()); } } // Using classes to demonstrate first-class functions const greeter = new Greeter("John"); Logger.logGreeting(greeter); // Output: Hello, John!
Erklärung:
Bürger erster Klasse behandelt werden. Sie können Variablen zugewiesen, als Argumente übergeben und in Sammlungen gespeichert werden.
Wie Funktionen können auch Instanzen von Objekten oder Klassen alsBürger erster Klasse behandelt werden. Sie können sein:
// Assigning a function to a variable const greet = function(name) { return `Hello, ${name}!`; }; // Passing a function as an argument function logGreeting(fn, name) { console.log(fn(name)); } // Returning a function function createMultiplier(multiplier) { return function(number) { return number * multiplier; }; } logGreeting(greet, "John"); // Output: Hello, John! const double = createMultiplier(2); console.log(double(5)); // Output: 10
Erklärung:
class Greeter { constructor(name) { this.name = name; } greet() { return `Hello, ${this.name}!`; } } // Logging greeting class Logger { static logGreeting(greeter) { console.log(greeter.greet()); } } // Using classes to demonstrate first-class functions const greeter = new Greeter("John"); Logger.logGreeting(greeter); // Output: Hello, John!
Erklärung:
Klassenbasierte Vererbung ermöglicht es Ihnen, eine neue Klasse zu erstellen, die mithilfe des Schlüsselworts „extends“ Eigenschaften und Methoden von einer vorhandenen Klasse erbt.
function Car(make, model) { this.make = make; this.model = model; this.startEngine = function() { console.log(`${this.make} ${this.model} engine started.`); }; } const myCar = new Car("Toyota", "Corolla"); const yourCar = new Car("Tesla", "Model 3"); // Passing instance as an argument function showCarDetails(car) { console.log(`Car: ${car.make} ${car.model}`); } showCarDetails(myCar); // Output: Car: Toyota Corolla
class Car { constructor(make, model) { this.make = make; this.model = model; } startEngine() { console.log(`${this.make} ${this.model} engine started.`); } } const myCar = new Car("Toyota", "Corolla"); const yourCar = new Car("Tesla", "Model 3"); // Passing instance as an argument function showCarDetails(car) { console.log(`Car: ${car.make} ${car.model}`); } showCarDetails(myCar); // Output: Car: Toyota Corolla
Erklärung:
Polymorphismus ermöglicht es verschiedenen Objekten, ihre eigenen Versionen derselben Methode zu definieren, die für Objekte eines übergeordneten Typs aufgerufen werden kann.
class Animal { constructor(name) { this.name = name; } speak() { console.log(`${this.name} makes a sound.`); } } class Dog extends Animal { speak() { console.log(`${this.name} barks.`); } } const myDog = new Dog("Buddy"); myDog.speak(); // Output: Buddy barks.
function Animal(name) { this.name = name; } Animal.prototype.speak = function() { console.log(`${this.name} makes a sound.`); }; function Dog(name) { Animal.call(this, name); // Inherit properties } Dog.prototype = Object.create(Animal.prototype); // Inherit methods Dog.prototype.constructor = Dog; Dog.prototype.speak = function() { console.log(`${this.name} barks.`); }; const myDog = new Dog("Buddy"); myDog.speak(); // Output: Buddy barks.
Erklärung:
Kapselung beinhaltet das Verbergen der internen Details eines Objekts und das Offenlegen nur des Notwendigen. In JavaScript erreichen wir dies durch die Verwendung privater Felder (mit #) in klassenbasiertem OOP oder Abschlüssen in prototypbasiertem OOP.
class Animal { speak() { console.log("Animal makes a sound."); } } class Dog extends Animal { speak() { console.log("Dog barks."); } } class Cat extends Animal { speak() { console.log("Cat meows."); } } const animals = [new Dog(), new Cat()]; animals.forEach(animal => animal.speak()); // Output: // Dog barks. // Cat meows.
function Animal() {} Animal.prototype.speak = function() { console.log("Animal makes a sound."); }; function Dog() {} Dog.prototype = Object.create(Animal.prototype); Dog.prototype.speak = function() { console.log("Dog barks."); }; function Cat() {} Cat.prototype = Object.create(Animal.prototype); Cat.prototype.speak = function() { console.log("Cat meows."); }; const animals = [new Dog(), new Cat()]; animals.forEach(animal => animal.speak()); // Output: // Dog barks. // Cat meows.
Erklärung:
Abstraktion verbirgt komplexe Logik und legt nur notwendige Details offen. Dies kann erreicht werden, indem interne Details abstrahiert und wesentliche Methoden offengelegt werden.
// Assigning a function to a variable const greet = function(name) { return `Hello, ${name}!`; }; // Passing a function as an argument function logGreeting(fn, name) { console.log(fn(name)); } // Returning a function function createMultiplier(multiplier) { return function(number) { return number * multiplier; }; } logGreeting(greet, "John"); // Output: Hello, John! const double = createMultiplier(2); console.log(double(5)); // Output: 10
class Greeter { constructor(name) { this.name = name; } greet() { return `Hello, ${this.name}!`; } } // Logging greeting class Logger { static logGreeting(greeter) { console.log(greeter.greet()); } } // Using classes to demonstrate first-class functions const greeter = new Greeter("John"); Logger.logGreeting(greeter); // Output: Hello, John!
Erklärung:
Das Verständnis der Unterschiede und Gemeinsamkeiten zwischen klassenbasiertem und prototypbasiertem OOP in JavaScript verbessert Ihre Programmierkenntnisse. Erstklassige Funktionen und Instanzen, Vererbung, Polymorphismus, Kapselung und Abstraktion sind grundlegende Konzepte, die Sie nutzen können, um saubereren und wartbareren Code zu schreiben.
Während die moderne klassenbasierte-Syntax (eingeführt in ES6) für Entwickler aus anderen OOP-Sprachen besser lesbar und vertraut ist, ist der prototypbasierte-Ansatz für JavaScript grundlegender zugrunde liegendes Verhalten.
Dieser Blog zeigt, wie zentrale OOP-Konzepte – erstklassige Funktionen, erstklassige Instanzen, Vererbung, Polymorphismus, Kapselung und Abstraktion – können in beiden Paradigmen erreicht werden. Unabhängig davon, ob Sie Klassen oder Prototypen verwenden, bietet JavaScript robuste Mechanismen, um OOP auf flexible und leistungsstarke Weise zu implementieren.
Das obige ist der detaillierte Inhalt vonJavaScript-OOP-Konzepte: klassenbasiert vs. prototypbasiert. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!