跳到主要内容

原型与继承

一、原型和原型链

  • 每个对象都拥有一个原型对象prototype
  • 通过new 操作创建一个对象的实例,实例内包含指向对象原型的指针,使用proto属性来表示,如:
    • 创建一个对象var a ={}(相当于是var a = new Object({})),那么a.proto指向Object.prototype
    • 创建一个构造函数F及其实例
      • f1 是F的一个实例,包含原型指针proto属性,指向F.prototype
      • F是构造函数,包含原型F.prototype对象:
        • F.prototype.constructor指向F构造函数本身;
        • F.prototype对象又是Object的一个实例,所以F.prototype.proto原型指针指向Object原型;
          • Object.prototype.constructor指向Object对象本身;
          • Object.prototype.proto原型指针指向null
      • 原型支持修改、重写
      • proto并不是规范中的属性,可以使用Object.getPrototypeof(obj)方法来获取对象的原型
      • 原型链是指:对象的原型还有原型,一直找到原型链的尽头null,也就是Object.prototype.proto===null
      • hasOwnProperty()方法来判断属性是否是原型链上的属性

二、原型、proto、构造函数三者关系

原型链

三、对象继承的方式

  • 继承其实就是一个对象能使用另一个对象的属性/方法
  • 实现继承的方式:通过原型——只要一个对象在另一个对象的原型链上
    • 使用new操作对象
    • B使用call/apply调用构造函数A,再指定B.prototype
    • 使用Object.create()
    • ES6的class ... extends + super()方法

四、如何获得对象非原型链上的属性?

for(var key in obj) {  
if(obj.hasOwnProperty(key)) {
// ...
}
}