工厂函数
将一系列的属性和方法封装成一个构造函数,使用的时候需要使用new关键字来调用构造函数,目的是为了得到一个独立的实例对象 - js里有内置的构造函数 var obj = new Object(); 1. 当使用new调用函数之后发生了什么? - 第一步在函数中创建一个对象 - 第二步函数中的this指向该对象 - 第三步把函数中的this返回出去 - 第四步使用变量接收构造函数的返回值--实力对象 2. 工厂函数的优势 - 独立的作用域,不会污染全局 - 实力出来的对象都是互相独立,互不影响 3. 工厂函数的缺点 - 每次实例化都是在内存中开一个新的对象存储,如果大量实例化会占用内容
对象,原型,原型链,构造函数之间的关系
-
对象就是使用构造函数new出来的。
-
原型是构造函数的prototype对象,这里除了function函数有原型对象,类也有,基于它可以实现对象的继承
-
原型链指的是实例对象身上的proto对象,proto指向的是构造函数的prototype,当我们使用对象点一个属性的时候,这个查找属性的过程称为原型链,程序会沿着对象的proto对象一直找的过程叫原型链
-
构造函数是new的函数,也是实例对象的proto下面的constructor【构造函数】
改变this指向的三种方式
【注意】 修改this指向的函数必须是function函数,因为这些方法来自于prototype对象上的,而箭头函数没有原型对象,所以箭头函数不能改变this
call
-
第一个参数是对象,后面的参数都是独立传入的
-
一旦使用则会立即调用函数
apply
-
第一个参数是对象,后面的参数放在数组里
-
一旦使用则会立即调用函数
bind【es6】
-
第一个参数是对象,后面的参数可以是任意
-
不会立即调用对象,而是返回一个修改了this之后的新函数
class类【es6】
-
类的概念:基于面向对象的概念实现的封装。特点是:封装,多态,继承。
-
class类是原型函数的语法糖
类的底层原理
-
es6的类还是基于函数的prototype封装的,他只是工厂函数的语法糖,其底层代码还是基于函数的封装
-
因为是基于prototype对象实现的class,在严格意义上它属于伪类
类的继承
-
子类继承于父类使用关键字extends
-
当使用new来调用子类的时候,程序会先从子类自身初始化所有的属性和方法,其次才沿着原型对象找到父类,获取父类的属性和方法,如果父类和子类都有相同的属性和方法,则使用子类的替代父类的。