JavaScript原型是JavaScript語言的核心特性之一。它是一種基于對象的編程范式,允許開發者在不使用類的情況下創建對象。在JavaScript中,每個對象都關聯著一個原型對象,這個原型對象包含了對象共享的屬性和方法。
JavaScript的原型可以用來創建基于實例的繼承,這種繼承機制被稱為原型繼承。在原型繼承機制中,對象可以通過原型鏈訪問和繼承父對象的屬性和方法。原型鏈指的是每個對象的原型對象構成的鏈式結構。
function Person(name) { this.name = name; } Person.prototype.sayHello = function() { console.log("Hello, " + this.name + "!"); } var person = new Person("John"); person.sayHello(); //輸出:Hello, John!
在這個例子中,我們創建了一個Person類。通過構造函數,我們可以創建Person的實例,并為實例對象添加name屬性。然后,我們將一個函數sayHello添加到Person.prototype原型對象中。所有通過Person類創建的實例都可以繼承這個方法。
可以使用Object.getPrototypeOf(object)方法來動態獲取對象的原型對象。如果需要判斷一個對象的原型是否相同可以使用Object.isPrototypeOf(object)方法。在ES6之后,可以使用Object.setPrototypeOf(object, prototype)方法設置一個對象的原型。
var person = new Person("John"); console.log(Person.prototype === Object.getPrototypeOf(person)); //輸出:true console.log(Person.prototype.isPrototypeOf(person)); //輸出:true var obj = {}; Object.setPrototypeOf(obj, Person.prototype); console.log(obj instanceof Person); //輸出:false console.log(Person.prototype.isPrototypeOf(obj)); //輸出:true console.log(obj.name); //輸出:undefined
在這個例子中,我們使用Person類創建了一個person對象。我們使用Person.prototype和Object.getPrototypeOf(person)驗證對象的原型是否正確。
我們創建了另一個空對象,并使用Object.setPrototypeOf設置其原型為Person.prototype。我們可以使用Person.prototype.isPrototypeOf(obj)驗證設置是否成功。雖然我們設置了obj的原型為Person.prototype,但obj并不是Person的實例。因此我們訪問obj的name屬性將返回undefined。
通過JavaScript原型,可以創建靈活且可擴展的對象。原型鏈讓JavaScript中的繼承變得簡單。原型也是實現面向對象編程的核心。