要撰寫有關JavaScript 物件導向程式設計(OOP) 概念和原型的詳細博客,我們將首先介紹一等函數、 -類別實例、繼承、多態性、封裝和抽象,解釋基於類別的 和基於原型的 方法。
JavaScript 的獨特之處在於它可以支援基於類別的 OOP(在 ES6 中引入)和基於原型的 OOP(JavaScript 處理 OOP 的原始方式)。本部落格將深入探討關鍵的OOP 概念,例如一等函數、一等實例、繼承、多態性、封裝和抽象使用這兩種方法。
在 JavaScript 中,函數是一等公民。這表示函數可以是:
絕對!讓我們對部落格文章進行分解,以涵蓋在 JavaScript 中使用函數式和基於類別的方法的一流函數和一流實例。這將使您在物件導向程式設計 (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
說明:
範例:類別上下文中的一流函數
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!
說明:
一等公民。它們可以分配給變量,作為參數傳遞,並儲存在集合中。
與函數一樣,物件或類別的實例也可以被視為一等公民。他們可以是:
// 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!
說明:
基於類別的繼承允許您使用extends關鍵字建立一個從現有類別繼承屬性和方法的新類別。
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
說明:
多態允許不同的物件定義相同方法的自己的版本,可以在父類型的物件上呼叫。
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.
說明:
封裝涉及隱藏物件的內部細節並僅公開必要的內容。在 JavaScript 中,我們透過在 基於類別的 OOP 中使用私有欄位(帶有 #)或在 基於原型的 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.
說明:
抽象隱藏複雜的邏輯,只暴露必要的細節。它可以透過抽像出內部細節並公開基本方法來實現。
// 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!
說明:
了解 JavaScript 中基於類別 和 基於原型 OOP 之間的差異和相似之處可以增強您的程式設計技能。一流的函數和實例、繼承、多態性、封裝和抽象化是基本概念,您可以利用它們來編寫更清晰、更易於維護的程式碼。
雖然現代基於類別的 語法(在ES6 中引入)對於來自其他OOP 語言的開發人員來說更具可讀性和熟悉性,但基於原型 方法對於JavaScript 來說更為基礎潛在行為。
本部落格示範了核心OOP 概念— 第一類函數、第一類實例、繼承、多態性 、封裝和抽象——兩種範式都可以實現。無論您使用類別還是原型,JavaScript 都提供了強大的機制,以靈活且強大的方式實現 OOP。
以上是JavaScript OOP 概念:基於類別與基於原型的詳細內容。更多資訊請關注PHP中文網其他相關文章!