Untuk menulis blog terperinci tentang konsep Pengaturcaraan Berorientasikan Objek (OOP) JavaScript dan prototaip, kami akan melalui fungsi kelas pertama, dahulu -contoh kelas, warisan, polimorfisme, pengkapsulan dan abstraksi, menerangkan kedua-duanya berasaskan kelas dan pendekatan berasaskan prototaip.
JavaScript adalah unik kerana ia boleh menyokong kedua-dua OOP berasaskan kelas (diperkenalkan dalam ES6) dan OOP berasaskan prototaip (cara asal JavaScript mengendalikan OOP). Blog ini akan menyelami konsep OOP utama seperti fungsi kelas pertama, contoh kelas pertama, warisan, polimorfisme, enkapsulasi dan abstraksi menggunakan kedua-dua pendekatan.
Dalam JavaScript, fungsi ialah warga kelas pertama. Ini bermakna fungsi boleh:
Sudah tentu! Mari kita pecahkan catatan blog untuk merangkumi kedua-dua fungsi kelas pertama dan contoh kelas pertama menggunakan kedua-dua pendekatan berfungsi dan berasaskan kelas dalam JavaScript. Ini akan memberikan pemahaman yang jelas tentang konsep ini dalam konteks Pengaturcaraan Berorientasikan Objek (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
Penjelasan:
Walaupun fungsi adalah warga kelas pertama, kami juga boleh mencipta kelas yang meniru gelagat serupa.
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!
Penjelasan:
Instance objek atau kelas juga boleh dianggap sebagai warga kelas pertama. Ia boleh ditugaskan kepada pembolehubah, diluluskan sebagai argumen dan disimpan dalam koleksi.
Seperti fungsi, kejadian objek atau kelas juga boleh dianggap sebagai warga kelas pertama. Mereka boleh menjadi:
// 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
Penjelasan:
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!
Penjelasan:
Warisan Berasaskan Kelas membolehkan anda mencipta kelas baharu yang mewarisi sifat dan kaedah daripada kelas sedia ada menggunakan kata kunci lanjutan.
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
Penjelasan:
Polymorphism membenarkan objek yang berbeza untuk menentukan versi mereka sendiri bagi kaedah yang sama, yang boleh dipanggil pada objek jenis induk.
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.
Penjelasan:
Encapsulation melibatkan penyembunyian butiran dalaman objek dan mendedahkan perkara yang perlu sahaja. Dalam JavaScript, kami mencapai ini dengan menggunakan medan peribadi (dengan #) dalam OOP berasaskan kelas atau penutupan dalam OOP berasaskan prototaip.
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.
Penjelasan:
Abstraksi menyembunyikan logik yang kompleks dan hanya mendedahkan butiran yang diperlukan. Ia boleh dicapai dengan mengabstraksi butiran dalaman dan mendedahkan kaedah penting.
// 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!
Penjelasan:
Memahami perbezaan dan persamaan antara berasaskan kelas dan berasaskan prototaip OOP dalam JavaScript meningkatkan kemahiran pengaturcaraan anda. Fungsi dan kejadian kelas pertama, pewarisan, polimorfisme, enkapsulasi dan abstraksi ialah konsep asas yang boleh anda manfaatkan untuk menulis kod yang lebih bersih dan lebih boleh diselenggara.
Walaupun sintaks berasaskan kelas moden (diperkenalkan dalam ES6) lebih mudah dibaca dan biasa kepada pembangun yang datang dari bahasa OOP lain, pendekatan berasaskan prototaip adalah lebih asas kepada JavaScript. tingkah laku asas.
Blog ini menunjukkan cara konsep teras OOP — fungsi kelas pertama, contoh kelas pertama, warisan, polimorfisme, enkapsulasi, dan abstraksi — boleh dicapai dalam kedua-dua paradigma. Sama ada anda menggunakan kelas atau prototaip, JavaScript menawarkan mekanisme yang teguh untuk melaksanakan OOP dengan cara yang fleksibel dan berkuasa.
Atas ialah kandungan terperinci Konsep OOP JavaScript: Berasaskan Kelas lwn Berasaskan Prototaip. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!