舉個很好理解的例子:愛迪生髮明電燈泡先畫圖紙函數
按照圖紙嘗試製做電燈泡,也許失敗繼續畫新圖紙……成功製做了電燈泡this
燈泡圖紙 第一個電燈泡 spa
愛迪生帶着燈泡圖紙 ,搭建了 燈泡工廠 ,燈泡產品才批量生產,並進入千家萬戶prototype
燈泡圖紙: 記錄了燈泡的相關信息 由愛迪生實驗室產生的 不是燈泡工廠中產生的3d
燈泡工廠: 就比如產生對象的 構造器/類orm
燈泡產品: 就比如由構造器實例化出來的對象對象
燈泡產品是根據燈泡圖紙製做的blog
燈泡產品是由工廠製做的不是由圖紙製做的繼承
圖紙由愛迪生實驗室中產生的 不是工廠中產生的。原型鏈
能夠相定義函數同樣定義構造器
例如:function Light(){
this.price=20;
}
這樣就至關於定義了一個構造器。構造器.prototype能夠訪問原型對象
普通對象.__proto__訪問原型對象
例如:先經過2例子的構造器建立一個普通對象
var li=new Light();
li.__proto__;
原型對象.constructor 訪問構造器
例如:經過3例子的原型對象訪問構造器
li.__proto__.constructor或者Light.prototype.constructor
在系統中,原型對象之間就存在這樣一種一環扣一環的引用關係
這樣的一種一環扣一環的結構就被稱爲原型鏈而且這個鏈條有終點,這個終點就是null
當試圖訪問一個對象身上的屬性時,就會使用原型鏈訪問原則:
1、首先在當前對象身上查找屬性,若是有,就直接使用
二、若是沒有,就在該對象的原型對象身上繼續查找該屬性,若是有直接使用
3、若是沒有,就在原型的原型身上繼續查找該屬性,若是有直接使用
直到找到原型鏈的終點(null),依然沒有,就返回undefined;
可是你須要注意:若是把數據放在Object{}原型對象上,不但Light對象能訪問,甚至字符串和數值也能訪問,
因此使用原型鏈繼承時,應該要注意把數據放在原型鏈的近處,避免數據污染