构造函数、原型及原型链,类的整理

107 阅读5分钟

一、构造函数

1.1什么是构造函数?

构造函数本身就是一个函数,与普通函数没有任何区别,不过为了规范一般将其首字母大写。构造函数和普通函数的区别在于,使用 new 生成实例的函数就是构造函数,直接调用的就是普通函数。

1.2构造函数分为实例成员和静态成员

实例成员:  实例成员就是在构造函数内部,通过this添加的成员。实例成员只能通过实例化的对象来访问。

静态成员:  在构造函数本身上添加的成员,只能通过构造函数来访问

1.3如何通过构造函数创建一个对象?

通过new关键字实例化对象

new一个新对象的过程?

(1) 创建一个空对象 son {}
(2) 为 son 准备原型链连接 son.__proto__ = Father.prototype
(3) 重新绑定this,使构造函数的this指向新对象 Father.call(this)
(4) 为新对象属性赋值 son.name
(5) 返回this return this,此时的新对象就拥有了构造函数的方法和属性了

1.4如何定义方法,方法是共享的吗?

1)在构造函数上直接定义方法(不共享)

2)通过原型添加方法(共享)

二、原型

2.1什么是原型,有什么作用?

Father.prototype 就是原型,它是一个对象,我们也称它为原型对象。原型的作用,就是共享方法,不会反应开辟新的空间存储方法。

2.2原型的this指向是什么?

原型中this的指向是实例。

三、原型链

3.1什么是原型链,有什么作用?

原型与原型层层相链接的过程即为原型链。每个对象都有__proto__原型的存在,可以通过原型查找属性或方法

3.2原型查找方式

例如:查找实例对象的dance方法

(1)首先看对象身上是否有dance方法,如果有,则执行对象身上的方法。

(2)如果没有dance方法,就去构造函数原型对象prototype身上去查找dance这个方法。

(3)如果再没有dance方法,就去Object原型对象prototype身上去查找dance这个方法。

(4)如果再没有,则会报错。

3.3构造器constructor

原型对象prototype的构造器指向构造函数。

3.4在原型上添加方法需要注意的地方

方法1:构造函数.prototype.方法在原型对象上直接添加方法,此时的原型对象是有constructor构造器的,构造器指向构造函数本身

方法2:Star.prototype = {}给原型重新赋值,此时会丢失构造器,我们需要手动定义构造器,指回构造函数本身

四继承 - ES5方法

4.1 原型链继承

将父类的实例作为子类的原型

function Parent() {}
function Child() {}
Child.prototype = new Parent();

4.2 构造函数继承

在子类构造函数中调用父类构造函数,可以在子类构造函数中使用call()apply()方法(改变父类this指向)子类不能访问父类原型上定义的方法

function Parent() {}
function Child() {
    Parent.call(this)
}

4.3 组合继承

组合继承综合了原型链继承盗用构造函数继承(构造函数继承),将两者的优点结合了起来,基本的思路就是使用原型链继承原型上的属性和方法,而通过构造函数继承实例属性,这样既可以把方法定义在原型上以实现重用,又可以让每个实例都有自己的属性

五、类

什么是类?

类的本质还是一个函数,类就是构造函数的另一种写法。类的所有方法都定义在类的prototype属性上面

constructor方法

constructor方法是类的默认方法,通过new命令生成对象实例时,自动调用该方法。一个类必须有constructor方法,如果没有显式定义,一个空的constructor方法会被默认添加。

六、继承 - ES6方法

Class 可以通过extends关键字实现继承,继承了父类的所有属性和方法

子类必须在constructor方法中调用super方法,否则新建实例时会报错。这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,加上子类自己的实例属性和方法。如果不调用super方法,子类就得不到this对象。

七、ES5与ES6继承的区别

1)ES5 的继承,实质是先创造子类的实例对象this,然后再将父类的方法添加到this上面

2)ES6 的继承机制完全不同,实质是先将父类实例对象的属性和方法,加到this上面(所以必须先调用super方法),然后再用子类的构造函数修改this

八、总结

构造函数特点:

1)构造函数有原型对象prototype,原型对象里有构造器constructor指向构造函数本身。

2)构造函数创建的实例对象有原型__proto__,指向构造函数的原型对象prototype。

类特点:

1)class本质还是function,ES6的类其实就是语法糖。

2)类的所有方法都定义在类的prototype属性上

3)类创建的实例,里面也有__proto__指向类的prototype原型对象