js中的继承是基于原型链来实现的,被实例化对象的__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创造出来的
var fn1 = new Function("a","b","return a + b")
console.log(fn1("x","jz"))
//"xjz"
如果说function的实例化对象的__proto__都指向了function对象的prototype属性,那么function对象本身的__proto__都指向了Function.prototype(Function也是一个函数对象,也有__proto__属性。既然是函数,那么它一定是被Function创建。所以Function是被自身创建的。所以它的__proto__指向了自身的Prototype。)
Object.__proto__ === Function.prototype
//true
终极原型链图示