原型
什么是对象的原型?
- 每一个对象中都有一个[[prototype]]的属性,这个属性称为对象的原型(隐式原型)
- 早期ECMA没有提供如何去查看原型,但浏览器给对象提供了一个属性proto可以帮助我们查看对象的原型。(proto只用于测试,不能用于编码)
- ES5之后提供Object.getPrototypeOf(XXX)去查看某个对象的原型
原型有什么用?
- 当我们从一个对象中去获取某一个属性时,会触发[[get]]操作
- 在当前对象中查找对应属性,找的到就直接用
- 如果没有找到,就沿着原型链去查找
// Foo构造函数默认有个prototype的属性 // Foo.prototype -> 显示原型 // Foo.prototype里面有个constructor属性 // Foo.prototype.constructor -> Foo // 当然Foo也是一个对象也有proto属性指向构造函数的prototype
let p1 = new Foo() // p1是Foo构造函数new出来的对象 // 则 p1.proto = Foo.prototype // 所以对象的隐式原型指向的是构造函数的显示原型
// 补充 // 当打印 console.log(Foo.prototype)时是空对象是因为里面的constructor属性 // 的描述符中enumerable设置为了false也就是不可枚举,所以在打印的时候看不到 // 但可以通过Foo.prototype.constructor访问到
<a name="QtZqb"></a>
### 修改显示原型
```javascript
// 有时候需要在原型上添加许多属性
// 通过 Foo.prototype.xxx的方式太麻烦了
// 这时可以通过
Foo.prototype = {}
Object.defineProperty(Foo,"constructor",{
configurable:true,
enumerable:false,
value:Foo,
writable:true
})