一、概念
原型
在JavaScript中,每當(dāng)定義一個(gè)函數(shù)數(shù)據(jù)類型(普通函數(shù)突硝、類)時(shí)候,都會(huì)天生自帶一個(gè)prototype屬性置济,這個(gè)屬性指向函數(shù)的原型對象,并且這個(gè)屬性是一個(gè)對象數(shù)據(jù)類型的值锋八。
原型鏈
對象之間的繼承關(guān)系浙于,在JavaScript中是通過prototype對象指向父類對象,直到指向Object對象為止挟纱,這樣就形成了一個(gè)原型指向的鏈條羞酗,專業(yè)術(shù)語稱之為原型鏈。
二紊服、淺析
當(dāng)我們聲明對象時(shí)檀轨,js 會(huì)在棧里生成對象現(xiàn)有屬性,并將__proto__
指向原型
1.當(dāng)我們訪問對象的一個(gè)屬性或方法時(shí)欺嗤,它會(huì)先在對象自身中尋找参萄,找到則直接使用
2.若未找到,則去原型對象中尋找煎饼,找到則直接使用讹挎。
3.若仍未找到,則去原型的原型中尋找,直到找到Object原型。
4.如果在Object原型中依然沒有找到筒溃,則返回undefined马篮。
String Number Boolean 與 Object 不同
Object比其它三種類型的尋找次數(shù)少一次
String :自身屬性 -> String原型 -> Object原型
Object:自身屬性 -> Object原型
var o1={}
o1.__proto__===Object.prototype //true
var n1=new Number(1)
n1.__proto__===Number.prototype //true
n1.__proto__.__proto__===Object.prototype //true
// String Boolean 也類似
var o1=new Object()
var o2=new Object()
01===02 // false
01.toString===02.toString //true 因?yàn)閠oString是共用屬性
prototype
與__proto__
prototype
是window默認(rèn)存在的,比如:
String.prototype
是 String 原型的引用(默認(rèn)存在怜奖,不寫代碼也有浑测。指向String原型,防止原型被瀏覽器回收)
var s=new String('11')
s.__proto__
也是是 String 原型的引用(寫了代碼后才有)
對象.__proto__ === 對象的構(gòu)造函數(shù).prototype
兩者的區(qū)別是:__proto__
是對象的屬性歪玲,prototype
是函數(shù)的屬性
概念解釋參考:原型與原型鏈詳解