js中的繼承是基于原型鏈來實現(xiàn)的,被實例化對象的__proto__屬性指向了繼承的對象
function Fn(){
this.name = "許吉中"
}
Fn.prototype.birthday = "1993"
var foo_a = new Fn()
console.log(foo_a.birthday) //1993
這段代碼中晕鹊,foo_a.__proto__就指向了Fn的prototype屬性松却,在Fn的prototype屬性添加屬性暴浦,foo_a可以直接繼承過來
foo_a.__proto__ === Fn.prototype
//true
而所有的Fn.prototype的__proto__都會指向Object.prototype,這里所說的Fn為function對象晓锻,而非function new出來的實例化對象歌焦,這也是為什么說Object是每一個對象的父類,每一個對象都可以使用Object中的方法
Fn.prototype.__proto__ === Object.prototype
//true
Object.prototype的__proto__指向null
Object.prototype.__proto__ === null
//true
要特殊注意的是Function對象砚哆,注意F是大寫的独撇,所有的function對象都是Function創(chuàng)造出來的
var fn1 = new Function("a","b","return a + b")
console.log(fn1("x","jz"))
//"xjz"
如果說function的實例化對象的__proto__都指向了function對象的prototype屬性,那么function對象本身的__proto__都指向了Function.prototype(Function也是一個函數(shù)對象躁锁,也有__proto__屬性纷铣。既然是函數(shù),那么它一定是被Function創(chuàng)建战转。所以Function是被自身創(chuàng)建的关炼。所以它的__proto__指向了自身的Prototype。)
Object.__proto__ === Function.prototype
//true
終極原型鏈圖示