对象、类与面向对象编程

61 阅读2分钟

1.1 Object.defineProperty

1. 为什么我们需要用到Object.defineProperty?

--> 有了Object.defineProperty我们就可以做到对对象属性特性的精准控制。

1.2 对象的解构

1. 对象解构可以为我们做什么

--> 对象的解构可以实现一个或多个变量的声明以及对他们进行赋值操作。

1.3 原型

1. 原型的好处

--> 定义在原型上的属性和方法,它的实例都可以共享,从而避免了对需要用到该属性或该方法的实例进行重写,减少了内存的损耗。

2.原型链

实例上的__proto__或者[[prototype]]指向其构造函数的prototype。

一切函数的实例都来自于Function这个构造函数,故而Function的__proto__指向的是Function本身的prototype。

1.4 继承

1.关于继承

--> 对于继承,我们所要继承的除了父类实例上所存在的东西外,还需要继承父类原型上所存在的东西。

2.几种继承方式

组合继承

通过原型链继承父类原型上的东西,通过盗用构造函数继承父类实例上的东西。

  • 优点:结合单独使用原型连和盗用构造函数的优点。
  • 缺点:调用了两次父类的构造函数,第一次是创建子类原型时;第二次是用盗用构造函数继承父类上的属性时。并且这两次调用会产生两份数据,一份在子类上,一份在子类原型上。
原型式继承

本质上是Object()对传入对象进行一次浅复制,而Object()会创造一个临时构造函数,把传入的对象赋值给这个构造函数的原型,然后返回这个临时构造函数的一个实例。

  • 优点: 简单
  • 缺点: 因为是给原型添加东西,所以就容易导致每个实例化对象都一样。
寄生式继承

对父类原型进行拷贝,然后返回指向该原型的一个对象。

  • 缺点:会导致函数难以重用。
寄生式组合继承

通过盗用构造函数继承属性,通过寄生式继承来继承父类原型。

  • 优点:效率更高

1.4 类

1.new

使用new调用类的构造函数时:

  • 会在内存中创建一个新对象
  • 将构造函数的prototype赋值给新对象的[[prototype]]
  • 构造函数内部的this指向这个新对象
  • 执行构造函数的代码
  • 若构造函数返回一个非空对象,那么将该对象返回;否则返回新对象
2.super函数

为什么需要用到super函数?

--> super函数在派生类的构造函数中被调用,实际上相当于调用父类的构造函数并绑定父类的一些公共字段,这样派生类可以进行访问以及可以对this进行修改。