上篇文章所使用的工厂方法创建的对象,使用的构造函数都是Object,所以创建出来的对象都是Object类型,会导致我们无法区分多种不同类型的对象(如果创建的对象有人,动物,服饰,美食,这些类型都是Object,无法区分)。
// 人类
function person(name,age,sex){
var obj = new Object();
obj.name = name;
obj.age = age;
obj.sex = sex;
return obj;
}
var per = person("小明",17,"男");
console.log(per); // 属于Object类型
// 美食类
function food(name,taste){
var obj = new Object();
obj.name = name;
obj.taset = taste;
return obj;
}
var food = food("橙子","酸的");
console.log(food); // 属于Object类型
所以,我们可以自己创建一个构造函数,专门用来创建Person对象。
构造函数没有new Object,但是它后台会自动var obj = new Object。
this就相当于obj。
构造函数不需要返回对象引用return,会后台自动返回。
构造函数就是一个普通函数,创建方式和普通函数没区别,不同的是,构造函数习惯上首字母大写。
还有一点是构造函数和普通函数的调用方式不同,普通函数是直接调用,而构造函数需要使用new关键字调用。
构造函数执行流程:
1.只要出现了new,会立即创建一个对象
2.将新建的对象设置为函数中的this,在构造函数中可以使用this来引用新建的对象
3.返回执行函数中的代码
4.将新建的对象作为返回值返回
function Person(name,age,sex){
this.name = name;
this.age = age;
this.sex = sex;
}
var per = new Person("小沙",23,"男");
// 返回的是Person对象,而不再是Object
console.log(per);
function Food(name,taste){
this.name = name;
this.taste = taste;
}
var food = new Food("山楂","酸甜的");
// 返回的是food对象,而不再是Object
console.log(food);
输出的结果如下:
Person是Person,Food是Food,方便我们更好的区分多种不同类型的对象。
使用同一个构造函数创建的对象,我们称为一类对象,也将一个构造函数称为一个类,比如Person类,Food类。
我们将通过一个构造函数创建的对象,成为是该类的实例,比如per是Person的实例,food是Food的实例。
instanceof
使用instanceof可以检查一个对象是否是另一个类的实例。
语法:对象 instanceof 构造函数。
如果是返回true,反之返回false。
举例:
console.log(per instanceof Person); // true
console.log(food instanceof Person); // false
console.log(food instanceof Object); // true
console.log(per instanceof Object); // true
tips:
所有对象都是Object的后代,所以任何对象和Object做instanceof检查,都会返回true。
this情况补充:
- 当以函数形式调用时,this是window;
- 当以方法形式调用时,谁调用了方法this就是谁;
- 当以构造函数的形式调用时,this酒拾新创建的那个对象