作者: 她不美却常驻我心
博客地址: https://blog.csdn.net/qq_39506551
微信公众号:老王的前端分享
每篇文章纯属个人经验观点,如有错误疏漏欢迎指正。转载请附带作者信息及出处。
从零开始学前端 - 21. JS工厂函数和构造函数
从零开始学前端 - 21. JS工厂函数和构造函数
工厂函数和构造函数是面向对象编程的基础,由于在 ES6 之前 JS 没有引入类的概念,所以我们只能通过这种模式来实现封装,将对象抽象成类。
一、工厂函数
首先我们创建一个对象,这很简单:
var human = {
name : "小明",
sex : "男"
}
我们很简单的创建了一个对象,但如果需要我们创建十个、一百个是不是会存在大量的重复代码?
工厂模式是软件工程领域一种广为人知的设计模式,目的是为了抽象创建对象,考虑到在 JS 中无法创建类,因此用函数封装以特定接口创建对象。其实现方法非常简单,也就是在函数内创建一个对象,给对象赋予属性及方法再将对象返回即可,而这种函数的写法,被我们成为工厂函数。
function Human(name, sex){
var obj = {
};
obj.name = name;
obj.sex = sex;
return obj;
}
var human1 = Human("小明","男");
var human2 = Human("小红","女");
函数 Human()
能够根据接受的参数来构建一个包含所有必要信息的 Human
对象。可以无数次地调用这个函数,而且每次它都会返回一个独立的对象。
工厂模式是用来创建对象的一种最常用的设计模式。我们不暴露创建对象的具体逻辑,而是将逻辑封装在一个函数中,那么这个函数就可以被视为一个工厂。工厂模式根据抽象程度的不同可以分为:
函数每次执行都会在内部创建一个对象,然后进行一系列赋值操作之后返回。也就是说调用多少次,就会创建多少个独立的对象。这样创建的对象我们只知道他是一个对象,而并不能像 String
、Number
一样分辨出它是那种对象,因为返回的数据类型全部都是 Object
。
二、构造函数
任何的函数都可以作为构造函数存在,所谓的构造函数只是一个概念上的定义,通过关键字 new
来实例化对象。两者的区别主要是从功能上进行区分的:
构造函数的主要功能是创建特定类型的对象,与 new
一起使用,用于定义 “类”,初始化一个对象:
function Human(name, sex){
this.name = name;
this.sex = sex;
}
var man = new Human("小明","男");
var woman = new Human("小红","女");
man.name; // 小明
woman.name; // 小红
两段函数实现了相同的功能,但我们使用构造函数创建出的对象,拥有 constructor
属性,这个属性会指向创建该对象的构造函数,也就是说我们可以通过该属性判断它的对象类型。
console.log(man.constructor === Human); // true
console.log(man.constructor === Object); // false
但实际上我们一般都会使用 instanceof
运算符来判断对象的类型:
console.log(man instanceof