面向对象

91 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第1天,点击查看活动详情

Js万物皆对象

构造函数执行 VS 普通函数执行:

  1. 构造函数执行也像普通函数执行一样,产生私有上下文
  • AO
  • 作用域链
  • 初始this
  • ...
  • 释放和不释放
  1. 区别
  2. 默认创造一个空实例对象
  • Fn被称为类/构造函数
  • 创造的这个对象称之为类的实例对象
  1. 让上下文中的this指向创建的实例对象
  • 代码执行中,出现的 this.xxx=xxx,就是在给实例对象设置私有属性
  • let xxx=xxx 和实例对象没关系,只是给上下文中设置私有变量
  1. 观察函数的返回值 return
  • 如果函数返回的是“原始类型值”(或者没有返回值),则把创建的实例对象返回
  • 只有自己手动返回对象类型值,才以自己返回的为主
  1. 有无new区别
  • FN(10,20)函数执行,产生私有上下文;

    Fn 函数本身堆内存

  • new Fn(10,20)构造函数执行,创建其一个实例;

    new Fn;构造函数也执行了,只不过没有传递实参

  • 计算优先级:有参数列表new > 无参数列表new

构造函数模式好处:

  • 每一次new执行,都创造一个新的实例对象,实例和实例之间是“独立”的
  • 除了独立性还具备“公有”性,都可以基于__proto__找到所属类原型对象上为其提供的公共属性方法;非常方便的实现对“公/私”的管理;在插件、组件封装的时候,这个特点非常重要!!

所有对象都是Object的实例

  • 在不确定是谁new出来的时候,可以让其指向Object.prototype
  • 基本任何对象最后都可以基于__proto__找到Object.prototype

所有函数都是Function内置类的实例

  • 不论是内置构造函数,还是自定义的,再者是普通函数,基本都如此

Object是所有对象的“基类(最底层)”

  • Object.prototype.__proto__如果有值也是Object.prototype自己,没有意义。
  • 所以此处的__proto__ --> null

原型链

原型链查找机制:当进行“成员访问”的时候,先找对象的私有属性,如果存在则找的就是私有的;如果不存在,则默认按照__proto__去其所属类的原型对象prototype上查找;如果依然找不到,则继续基于原型对象的__proto__向上查找...直到找到Object.prototype为止!