JS原型鏈筆記
- 2019 年 10 月 29 日
- 筆記
構造函數創建對象:
function Person() { } var person = new Person(); person.name = 'Kevin'; console.log(person.name) // Kevin Person 就是一個構造函數,我們使用 new 創建了一個實例對象 person
prototype
每個函數都有一個 prototype 屬性 每一個JavaScript對象(null除外)在創建的時候就會與之關聯另一個對象,這個對象就是我們所說的原型,每一個對象都會從原型"繼承"屬性。
function Person() { } // 雖然寫在注釋里,但是你要注意: // prototype是函數才會有的屬性 Person.prototype.name = 'Kevin'; var person1 = new Person(); var person2 = new Person(); console.log(person1.name) // Kevin console.log(person2.name) // Kevin 
在這裡插入圖片描述
proto
每一個JavaScript對象(除了 null )都具有的一個屬性,叫proto,這個屬性會指向該對象的原型
function Person() { } var person = new Person(); console.log(person.__proto__ === Person.prototype); // true 
在這裡插入圖片描述
constructor
每個原型都有一個 constructor 屬性指向關聯的構造函數 實例原型指向構造函數
function Person() { } console.log(Person === Person.prototype.constructor); // true 
在這裡插入圖片描述
function Person() { } var person = new Person(); console.log(person.__proto__ == Person.prototype) // true console.log(Person.prototype.constructor == Person) // true // 順便學習一個ES5的方法,可以獲得對象的原型 console.log(Object.getPrototypeOf(person) === Person.prototype) // true 實例與原型
function Person() { } Person.prototype.name = 'Kevin'; var person = new Person(); person.name = 'Daisy'; console.log(person.name) // Daisy delete person.name; console.log(person.name) // Kevin 在這個例子中,我們給實例對象 person 添加了 name 屬性,當我們列印 person.name 的時候,結果自然為 Daisy。
但是當我們刪除了 person 的 name 屬性時,讀取 person.name,從 person 對象中找不到 name 屬性就會從 person 的原型也就是 person.proto ,也就是 Person.prototype中查找,幸運的是我們找到了 name 屬性,結果為 Kevin。
原型與原型
var obj = new Object(); obj.name = 'Kevin' console.log(obj.name) // Kevin

在這裡插入圖片描述
原型鏈
console.log(Object.prototype.__proto__ === null) // true

在這裡插入圖片描述 JavaScript 默認並不會複製對象的屬性,相反,JavaScript 只是在兩個對象之間創建一個關聯,這樣,一個對象就可以通過委託訪問另一個對象的屬性和函數,所以與其叫繼承,委託的說法反而更準確些
作者:饕餮瀦 鏈接:https://www.jianshu.com/p/be7c95714586 來源:簡書 著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
