引用类型

1、引用类型,都具有对象特性,都可自由扩展属性。

  1. const obj = {}
  2. const arr = []
  3. const fn = function () {}
  4. obj.a = 1
  5. arr.a = 1
  6. fn.a = 1
  7. console.log(obj.a) // 1
  8. console.log(arr.a) // 1
  9. console.log(fn.a) // 1

2、引用类型,都有一个隐式原型 proto 属性,属性值是一个对象。

  1. const obj = {};
  2. const arr = [];
  3. const fn = function() {}
  4. console.log('obj.__proto__', obj.__proto__);
  5. console.log('arr.__proto__', arr.__proto__);
  6. console.log('fn.__proto__', fn.__proto__);

图片.png``
3、引用类型,隐式原型 proto 的属性值指向它的构造函数的显式原型 prototype 属性。

  1. const obj = {};
  2. const arr = [];
  3. const fn = function() {}
  4. obj.__proto__ == Object.prototype // true
  5. arr.__proto__ === Array.prototype // true
  6. fn.__proto__ == Function.prototype // true

4、当你试图寻找一个对象的某个属性时,如果这个对象本身没有这个属性,那么它会去它的隐式原型 proto(也就是其构造函数的显式原型 prototype)中寻找。

  1. const obj = { a:1 }
  2. obj.toString
  3. 首先,obj 对象并没有 toString 属性
  4. 是从它的构造函数 Object prototype 里去获取。
  1. function Preson(name){
  2. this.name = name
  3. }
  4. const obj =new Preson('name')
  5. obj.toString()

首先 obj 是Preson 构造函数生成的实例对象 ,而Preson的protoType 中并没有toString方法 ,然后构造函数Preson 也是一个对象, 对象的构造函数 object , 所以object.protoType中存在toString()方法

原型原型链 - 图2