构造函数

构造函数prototype属性指向原型对象

  1. 原型对象 = 构造函数.prototype

new 可以创建实例对象

  1. 实例对象 = new 构造函数()

原型对象

原型对象的constructor属性可以指向构造函数

  1. console.log(构造函数.prototype.constructor == 构造函数)// true

实例对象

实例对象 proto 属性指向 原型对象

  1. console.log(new 构造函数().__proto__ == 构造函数.prototype) // true

prototype

它是函数所独有的,它是从一个函数指向一个对象。

它的含义是函数的原型对象,也就是通过这个构造函数创建的实例对象的原型对象

构造函数的prototype指向原型对象,这个原型对象就是该构造函数所创建的实例的原型

  1. console.log(new 构造函数().__proto__ == 构造函数.prototype) // true

每一个实例对象在创建的时候就会关联(继承)原型对象的属性,看下面的例子

  1. function Person() {
  2. }
  3. Person.prototype.name = 'Kevin';
  4. // 在原型对象上面绑定了 name = 'Kevin'
  5. var person1 = new Person();
  6. var person2 = new Person();
  7. console.log(person1.name) // Kevin
  8. console.log(person2.name) // Kevin
  9. // 实例对象 person1 和 person2 都可以可以继承name这个属性

proto

propo属性都是由一个对象指向一个对象,即指向它们的原型对象(也可以理解为父对象)

  1. console.log(new 构造函数().__proto__ == 构造函数.prototype) // true

当读取实例的属性时,如果找不到,就会查找关联的原型对象的属性(实例继承原型对象,自己没有的属性就往上要)原型对象也没有就去找原型的原型,一直找到最顶层为止。

  1. function Person() {
  2. }
  3. Person.prototype.name = 'Kevin'; //给原型对象绑定name属性 = 'Kevin'
  4. var person = new Person(); //实例对象
  5. person.name = 'Daisy'; // 给实例对象person绑定了name属性 = 'Daisy'
  6. //当实例对象有name直接输出实例对象的属性
  7. console.log(person.name) // Daisy
  8. delete person.name;// 删除实例对象的name属性
  9. // 实例对象没有name就往原型对象找原型对象有的话就直接继承该属性
  10. console.log(person.name) // Kevin

原型也是一个对象,既然是对象,我们就可以用最原始的方式创建它

  1. var obj = new Object();
  2. obj.name = 'Kevin'
  3. console.log(obj.name) // Kevin

其实原型对象就是通过 Object 构造函数生成的,实例的 proto 指向构造函数的 prototype

image.png

那 Object.prototype 的原型呢?
null

  1. console.log(Object.prototype.__proto__ === null) // true

null 表示“没有对象”,即该处不应该有值。

所以 Object.prototype.proto 的值为 null 跟 Object.prototype 没有原型,其实表达了一个意思。

所以查找属性的时候查到 Object.prototype 就可以停止查找了。
image.png
图中由相互关联的原型组成的链状结构就是原型链,也就是蓝色的这条线

constructor

constructor属性也是对象才拥有的,它是从一个对象指向一个函数,含义就是指向该对象的构造函数

也可以说对象的 constructor 属性返回对象的构造函数。

  1. console.log(构造函数 === 构造函数.prototype.constructor); // true
  2. const 构造函数 = 构造函数.prototype.constructor

prototype,proto,constructor 简单理解

构造函数.prototype返回原型对象

实例对象.proto返回原型对象(父对象)

原型对象.constructor属性返回构造函数