原型

什么是对象的原型?

  • 每一个对象中都有一个[[prototype]]的属性,这个属性称为对象的原型(隐式原型)
  • 早期ECMA没有提供如何去查看原型,但浏览器给对象提供了一个属性proto可以帮助我们查看对象的原型。(proto只用于测试,不能用于编码)
  • ES5之后提供Object.getPrototypeOf(XXX)去查看某个对象的原型

原型有什么用?

  1. 当我们从一个对象中去获取某一个属性时,会触发[[get]]操作
  • 在当前对象中查找对应属性,找的到就直接用
  • 如果没有找到,就沿着原型链去查找
  1. 实现继承:目的是重复利用另一个对象的属性和方法

    原型的流程

    ```javascript function Foo(){} // 构造函数

// 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访问到

  1. <a name="QtZqb"></a>
  2. ### 修改显示原型
  3. ```javascript
  4. // 有时候需要在原型上添加许多属性
  5. // 通过 Foo.prototype.xxx的方式太麻烦了
  6. // 这时可以通过
  7. Foo.prototype = {}
  8. Object.defineProperty(Foo,"constructor",{
  9. configurable:true,
  10. enumerable:false,
  11. value:Foo,
  12. writable:true
  13. })