工厂方法和构造函数创建对象
为何使用工厂方法和构造函数
我们不可能使用字面量创建大量的对象,其中存在许多的重复代码,我们就需要一个工厂来批量生产相似对象。
工厂方法
使用工厂方法创建对象,使用的构造函数都是Object,所以创建对象都是Object这个类型,导致我们无法区分不同类型对象就是不知道从哪来的
构造函数
创建自定义对象,首字母大写,普通函数直接调用,构造函数用new关键字。
构造函数执行流程:
1.立刻创建一个新的对象;
2.在这个新对象内部[[Prototype]]特性被赋值为构造函数的prototype属性
3.构造函数内部的this被赋值为这个新的对象(即this指向这个新对象)。
4.执行构造函数内部的代码(给新对象添加属性).
5.如果构造函数返回非空对象,则返回该对象;否则,返回刚创建的新对象。
使用同一个构造函数创建对象为同一类对象,也将构造函数称为一个类,通过构造函数创建对象称为该类的实例
语法:对象 instanceof 类(构造函数) 判断该对象是否为类的实例。
所有对象都是Object的实例。
赋值给变量的函数表达式也可以表示构造函数
<script>
let Person = function (name,age,job) {
this.name = name;
this.age = age;
this.job = job;
this.sayName = function () {
console.log(this.name);
};
};
/**
* 在实例化时,如果不想传参,那么构造函数后边的括号可加可不加。
* 只要有new操作符,就可以调用相应的构造函数
*/
let person1 = new Person("Tang",21,"Software Engineer");
let person2 = new Person;
console.log(person2 instanceof Object);//true
console.log(person2 instanceof Person);//true
</script>
工厂方法和构造函数区别
1.构造函数没有显示的创建对象
2.属性和方法都赋值给this
3.没有return
注意点
1.构造函数也是函数,和普通函数唯一区别就是调用方式不同。
2.任何函数只要使用new操作符调用就是构造函数,不使用就是普通函数。
3.在调用一个函数而没明确设置this值情况下即(即没有组作为对象方法调用,或者没有使用call()/apply()调用),this就指向Global对象,在浏览器中就是window对象。
4.构造函数也有其问题,每个实例都会创建一边其定义方法,但是其实没有必要,他们是公用方法,只有定义到构造函数之外