1、什麼是原型
① 函數的原型:prototype
② 對象的原型:__proto__
2、什麼是原型鏈
原型之間的指向關係構成一條鏈,這條鏈就叫原型鏈
3、原型鏈是怎樣指向的
- 通過構造函數,new出的對象,新對象的
__proto__
指向類的prototype - 非構造函數new出的對象,比如使用{},對象的
__proto__
指向Object的prototype - 所有函數的
__proto__
指上Function()的prototype - Object的prototype的
__proto__
指向null - *.prototype是一個對象,指向了當前構造函數的引用地址
4、舉例
function Person() {}
Person.prototype.a = 123;
var person = new Person()
console.log(person.a)//123
console.log(person.hasOwnProperty('a'));//false
console.log('a'in person)//true
person實例中沒有a這個屬性,從 person 對象中找不到 a 屬性就會從 person 的原型也就是 person.__proto__
,也就是 Person.prototype中查找,很幸運地得到a的值爲123。
假如 person.__proto__
中也沒有該屬性,就去找原型的原型,一直找到最頂層Object爲止。
5、習慣
既然成員屬性/方法和原型屬性/方法,都能通過對象名訪問。我們到底用那種比較好呢?
習慣上,我們會將屬性寫爲成員屬性,而方法寫爲原型方法