原型是 JavaScript 中的核心概念,構成了其物件導向程式設計 (OOP) 功能的基礎。其他語言使用類別作為繼承的基礎,而 JavaScript 則依賴原型。在本文中,我們將深入探索原型並揭示它們如何在 JavaScript 中支援繼承、物件行為等。
在 JavaScript 中,每個物件都有一個名為 [[Prototype]] 的內部屬性,它指向另一個物件。這是物件的原型,它充當未直接在物件上找到的屬性或方法的後備機制。
原型鍊是一系列連結的原型。如果在物件上找不到屬性或方法,JavaScript 會尋找鏈,直到達到 null。
const parent = { greet: () => console.log("Hello from parent!") }; const child = Object.create(parent); child.greet(); // Output: "Hello from parent!" console.log(child.hasOwnProperty('greet')); // Output: false
這裡,child 沒有greet 方法,因此JavaScript 會向parent 尋找原型鏈並在那裡找到它。
JavaScript 提供了兩個與原型相關的不同術語,這些術語可能會令人困惑:
__proto__:
原型:
範例:
function Person(name) { this.name = name; } Person.prototype.sayHello = function () { console.log(`Hello, my name is ${this.name}`); }; const alice = new Person("Alice"); console.log(alice.__proto__ === Person.prototype); // true alice.sayHello(); // Output: "Hello, my name is Alice"
JavaScript 的繼承是基於原型的,這意味著物件直接從其他物件而不是類別繼承。
建立繼承
const animal = { eat() { console.log("Eating..."); } }; const dog = Object.create(animal); dog.bark = function () { console.log("Barking..."); }; dog.eat(); // Output: "Eating..." dog.bark(); // Output: "Barking..."
狗物件繼承了動物物件的 eat 方法。
Object.create 方法建立一個具有指定原型的新物件。這是一種更清晰、更直覺的設定繼承的方式。
範例:
const person = { introduce() { console.log(`Hi, I'm ${this.name}`); } }; const student = Object.create(person); student.name = "John"; student.introduce(); // Output: "Hi, I'm John"
雖然可以擴展數組或物件等內建原型,但通常不鼓勵這樣做,因為它可能會導致衝突。
範例:
Array.prototype.last = function () { return this[this.length - 1]; }; console.log([1, 2, 3].last()); // Output: 3
為什麼要避免它?
在 ES6 中,JavaScript 引入了類別語法,提供了更熟悉的 OOP 體驗。然而,在幕後,類別仍然使用原型。
範例:
const parent = { greet: () => console.log("Hello from parent!") }; const child = Object.create(parent); child.greet(); // Output: "Hello from parent!" console.log(child.hasOwnProperty('greet')); // Output: false
即使是類,繼承也是基於原型的。
基於原型的繼承更加節省內存,因為方法是在實例之間共享而不是重複。
範例:
function Person(name) { this.name = name; } Person.prototype.sayHello = function () { console.log(`Hello, my name is ${this.name}`); }; const alice = new Person("Alice"); console.log(alice.__proto__ === Person.prototype); // true alice.sayHello(); // Output: "Hello, my name is Alice"
在這裡,每輛車的驅動器並不重複;相反,兩個實例共享相同的方法。
理解原型對於掌握 JavaScript 至關重要。雖然 ES6 類別使 JavaScript 中的物件導向程式設計變得更加平易近人,但原型系統仍然是該語言的核心。透過深入研究原型,您可以解鎖編寫高效、可擴展和可維護程式碼的能力。
以上是深入研究原型:JavaScript 的骨幹的詳細內容。更多資訊請關注PHP中文網其他相關文章!