原型

JavaScript中每个对象都有一个特殊的内置属性[[prototype]],指向当前对象的原型对象,该属性也称隐式原型

__proto__属性

早期的ECMA是没有规范如何去查看[[prototype]],于是浏览器中给对象中提供了一个属性,可以查看其原型对象

ES5之后提供了方法Object.getPrototypeOf()

对象的原型

当从一个对象中获取某个属性时,会触发对象的[[get]]操作

  • 在当前对象中查找到对应的属性时,就直接使用
  • 如果没有找到,就会沿着对象的原型去查找

函数的原型

函数也是一个对象,函数相对于对象来说,会多出一个显式原型属性prototype

原型对象

constructor属性

  1. Object.getOwnPropertyDescriptors(foo.prototype)
  2. /*
  3. {
  4. constructor:{
  5. configurable: true
  6. enumerable: false
  7. value: [Function foo]
  8. writable: true
  9. }
  10. }
  11. 直接打印foo.prototype可能看不到constructor属性,因为默认不可遍历,但在浏览器控制台里输出会显示
  12. */

修改原型对象过程

  1. 修改原型对象
  2. 修改原型对象中构造函数的绑定
  1. function foo(){};
  2. // 1. 修改原型对象
  3. foo.prototype={
  4. name:'rv',
  5. age:20
  6. }
  7. // 2. 修改原型对象中构造函数的绑定
  8. Object.defineProperty(foo.prototype,'constructor',{
  9. configurable: true,
  10. enumerable: false,
  11. value: foo,
  12. writable: true
  13. })
  14. /*
  15. 此处推荐使用Object.defineProperty()
  16. 因为这样可以详细配置属性描述符
  17. 而不推荐使用字面量形式创建属性constructor
  18. */

原型链

继承的实现方案

详见[-类继承原理实现]

相关内容补充

方法补充

Object.create()

  1. Object.create(prototype,property)
  2. /*
  3. 参数
  4. prototype:新建对象的原型对象
  5. property:新建对象自身属性描述符
  6. 返回值
  7. 新建对象
  8. */

Object.hasOwnProperty()

对象上是否有某一个自身对象的属性

in/for in操作符

判断某个属性是否在自身对象或对象的原型上

instanceof

用于检测构造函数的prototype是否出现在实例对象的原型链上