使用工厂方法创建对象, 对象实例的类型都是Object,不容易区分对象。
比如,创建一个人的对象, 和创建一个狗狗的对象,打印出来对象的类型都是Object, 很难区分。
这种情况, 用构造函数方法创建对象, 就可以解决了。
注意: 创建构造函数, 习惯首字母大写。
构造函数和普通函数的区别:
调用: 普通函数直接调用, 构造函数需要使用new关键字来调用。
this: 1.当以函数的形式调用时, this是window。
2.当以方法的形式调用时, 谁调用方法this就是谁。
3.当以构造函数的形势调用时, this就是新创建的对象。
function Person(){
}
//当做普通函数调用
var obj=Person();
//构造函数调用
var obj=new Person();
- 构造函数创建对象(方法写在构造函数里,缺点:构造函数每执行一次, 就会创建一次方法。)
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
// 方法写在里面
this.sayName=function(){
console.log(this.name);
}
}
function Dog(name,age){
this.name=name;
this.age=age;
}
var obj=new Person("张三",18,"男");
var obj1=new Person("李四",16,"男");
var dog=new Dog("乐乐",2);
obj.sayName();
obj1.sayName();
console.log(obj);
console.log(obj1);
console.log(dog);
- 构造函数创建对象(方法写在构造函数外,缺点: 方法为全局方法,污染全局。)
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
this.sayName=fun; //方法写在外面
}
function fun(){
console.log(this.name);
}
function Dog(name,age){
this.name=name;
this.age=age;
}
var obj=new Person("张三",18,"男");
var obj1=new Person("李四",16,"男");
var dog=new Dog("乐乐",2);
obj.sayName();
obj1.sayName();
console.log(obj);
console.log(obj1);
console.log(dog);
- 使用 instanceof可以检查一个对象是否是一个类的实例
/*检测对象是否是一个类的实例 instanceof*/
console.log(dog instanceof Person);
console.log(dog instanceof Dog);
console.log(dog instanceof Object);
console.log(obj instanceof Object);
/*打印结果, false true true true*/
- 构造函数创建对象改造(方法通过原型对象创建)
原型对象:prototype
我们所创建的每一个函数,解析器都会向函数中添加一个prototype属性。
指向构造函数的原型对象,我们可以通过__proto__来访问该属性。
构造函数.prototype.xxx , xxx可以是变量,可以是方法。执行过程中会先去对象中找方法或者变量, 找不到就会去原型里寻找。
function Person(name,age,gender){
this.name=name;
this.age=age;
this.gender=gender;
}
function Dog(name,age){
this.name=name;
this.age=age;
}
/*为person添加统一的方法, 到原型对象中*/
Person.prototype.sayName=function(){
console.log(this.name);
}
var obj=new Person("张三",18,"男");
var obj1=new Person("李四",16,"男");
var dog=new Dog("乐乐",2);
obj.sayName();
obj1.sayName();
console.log(obj);
console.log(obj1);
console.log(dog);
运行结果: