1.原型介绍

  1. prototype作用:存放构造函数的所有实例共享的信息
  2. 如何给函数添加原型信息
    函数名.prototype.属性名字=?
    函数名.prototype.方法名字=?
  3. 原型属性/原型方法 和 实例属性/实例方法的区别?
    a) 原型属性和原型方法是添加在函数.prototype里面的,拥有者是函数.prototype
    b) 实例属性和实例方法是添加在对象本身上面的,拥有者是对象本身
    c) 虽然原型属性和原型方法的拥有者是函数的. Prototype,但是这些信息是可以被所有的实例共享的
  1. proto和prototype
    函数的prototype:叫显示原型,他本身也是一个对象,作用是存放构造函数的所有实例共享的信息
    对象的proto : 叫隐式原型,这个属性不是标准属性,是给浏览器用的一个属性,他指向函数的prototype

对象.proto == 函数.prototype

在函数prototype中有三部分信息:分别是

1
2
3
1.	构造器       他指向函数本身
2. 所有实例共享的属性和方法
3. __proto__ 它指向父亲的.prototype

2.原型链

原型链的核心就是依赖对象的proto的指向,当自身不存在的属性时,就一层层的扒出创建对象的构造函数,直至到Object时,就没有proto指向了。

1
2
3
4
对象.__proto__ == 函数.prototype;
Person.prototype.constructor == Person;
Person.prototype.__proto__ == Object.prototype;
Object.prototype.__proto__ == null

img

3.new一个对象经历了什么

1
2
function Test(){}
const test = new Test()
  1. 创建一个新对象:
1
const obj = {}
  1. 设置新对象的constructor属性为构造函数的名称,设置新对象的__proto__属性指向构造函数的prototype对象
1
2
obj.constructor = Test
obj.__proto__ = Test.prototype
  1. 使用新对象调用函数,函数中的this被指向新实例对象
1
Test.call(obj)
  1. 将初始化完毕的新对象地址,保存到等号左边的变量中