原型
我们创建的每一个函数都有一个 prototype 属性,这个属性是一个指针,指向一个对象。
这个对象的用途是包含可以由特定类型的所有实例共享的属性和方法。
简单来说,该函数实例化的所有对象的__proto__的属性指向这个对象,它是该函数所有实例化对象的原型。
原型分为显式原型和隐式原型
- 显示原型就是对象上的prototype属性
- 隐式原型就是对象上的__proto__属性
原型上有一个constructor属性,该属性指向prototype所在的函数对象上
这三者的关系如图所示:
console.log(Person.prototype === p.__proto__); // true
console.log(Person.prototype.constructor === Person); // true
console.log(p.__proto__.constructor === Person); // true
...
原型链
当访问一个对象的属性时,如果这个对象内部不存在这个属性,那么它就会去它的原型对象里找这个属性,如果这个原型对象里也不存在这个属性,这个原型对象又会去自己的原型对象上找,于是就这样一直找下去,这样形成的链条就是原型链。
原型链的尽头一般来说都是 Object.prototype 所以这就是新建的对象为什么能够使用 toString() 等方法的原因。
而最后的原型,即Object.prototype.__proto__
的值是null,这就意味着原型链的结束。
获取原型的方法
- p.proto
- p.constructor.prototype
- Object.getPrototype§