JavaScript prototype
每一個 JavaScript 物件(除了 null)在創建的時候就會與之關聯另一個物件,這個物件就是所謂的原型,每一個物件都會從原型「繼承」屬性。

範例介紹
Person:建構函式。personA:實例物件。prototype:函式的 prototype 屬性指向了一個物件,這個物件正是「調用該建構函式而創建的實例」的原型。__proto__:指向該物件的原型(物件)。constructor:每個原型都有一個 constructor 屬性指向關聯的建構函式。
javascript
function Person() {
// something
}
const personA = new Person()- 原型物件
Person.prototype的constructor指向構造函式本身
javascript
Person.prototype.constructor === Person // true- 實例
personA的__proto__和原型物件指向同一個地方
javascript
personA.__proto__ === Person.prototype // true- ES5 的方法,可以獲得物件的原型
javascript
Object.getPrototypeOf(personA) === Person.prototype // true當獲取 personA.constructor 時,其實 personA 中並沒有 constructor 屬性。 當不能讀取到 constructor 屬性時,會從 personA 的原型( Person.prototype )中讀取,正好原型中有該屬性。
javascript
personA.constructor === Person.prototype.constructor原型的原型
原型也是一個物件,既然是物件,就可以用最原始的方式創建它。
javascript
const obj = new Object()
obj.name = 'Kevin'
console.log(obj.name) // Kevin原型物件就是透過 Object 建構函式所生成的,實例的 __proto__ 指向建構函式的 prototype。
原型鏈
Object.prototype 的原型為 null。
javascript
Object.prototype.__proto__ === null // true即代表 Object.prototype 沒有原型,所以查找屬性的時候查到 Object.prototype 就可以停止查找了。
除了 Object 的原型物件 Object.prototype 的 __proto__ 指向 null,其他內建函式物件的原型物件(例如:Array.prototype)和使用者定義的建構函式的原型物件的 __proto__ 都指向 Object.prototype。
javascript
Object.prototype.__proto__ === null
Array.prototype.__proto__ === Object.prototype
Person.prototype.__proto__ === Object.prototype