原型
原型包括显式原型和隐式原型,每个对象都具有隐式原型,只有函数拥有显式原型
获得显式原型的方法:
1.foo.prototype
获得隐式原型的方法:
1.浏览器提供的方法:obj.__proto__
2.ES5以后获取的方法:Object.getPrototypeOf(obj)
在通过new调用构造函数的时候,会将foo.prototype 赋值给obj.__proto__,这也是可以说是原型链的由来
function foo(){}
let obj = new foo() // obj.__proto__ = foo.prototype
foo.prototype有个constructor指向foo自己
原型链
一个对象的隐式原型指向其构造函数的显式原型,构造函数也是个对象,也有隐式原型,依次往上指直至顶层Object.prototype形成的链式结构叫作原型链
图解,从下往上:
通过new foo()生成的对象obj,obj.__proto__ = foo.prototype (foo的原型对象)
每个function都由new Function构造,所以 foo.__proto__ = Function.prototype (所有函数的构造函数)
Function函数自己构建自己,所以 Function.__proto__ = Function.prototype (特殊情况)
任何原型对象都是由new Object构造的, 所以 foo.prototype.__proto__ = Object.prototype
Object.prototype属于顶层对象了,Object.prototype.__proto__ = null 为原型链的终点