首先,说下工厂函数。顾名思义,就比如一个工厂同样,能够批量制造某种类型的东西。其实说白了就是封装了个方法减小重复工做,相信稍微有点码龄的人都懂。上代码:函数
function animal (name,sex) { let obj = new Object() obj.name = name obj.sex = sex obj.saySex = function () { alert(`个人性别是${this.sex}`) } return obj } let monkey = animal('猴子','母') console.log(monkey.name) //猴子 monkey.saySex() //个人性别是母
这样写主要是为了解决须要建立大量有属性重叠的对象,若是每一个都new一下,而后逐一添加属性。这也是个累人的活。经过上面的代码中,咱们声明了一个animal方法,此方法可批量制造动物。这样每次只须要简单的一行代码就能够搞定一个动物的建立。this
方便虽然方便,可是仍是有缺点。就是每次新建的时候都须要在内部建立一个对象,而后进行一系列操做,最后返回。也就是说建立十次,那么就会建立十次全新的对象,而后返回并赋值。这样建立的十个对象在代码间的关系是没有的,换句话说就是咱们都产自动物,可是谁都不知道咱们咱们产自哪里。code
应对某些场景,工厂函数并不能知足咱们,如:我须要判断树是否是动物类型,你会发现你并没办法。只能知道他是Object。这时候构造函数就出现了:对象
function animal (name,sex) { this.name = name this.sex = sex this.saySex = function () { alert(`个人性别是${this.sex}`) } } let monkey = new animal('猴子','母') console.log(monkey.name) //猴子 monkey.saySex() //个人性别是母
跟工厂函数很像,只是没有了建立对象和return,而且都用this添加属性。声明新对象的时候经过new关键字。这样作的好处是,新建的对象间是有关系的,咱们检测下:io
console.log(monkey instanceof animal) //true console.log(monkey instanceof Object) //true
咱们能够看到,他的类型既是animal也是Object。就比如你是你爸爸的后代,但同时也是你爷爷的后代。console