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