工厂方法和构造方法中一些不同的对比:
对比选项 | 工厂方法 | 构造方法 |
---|---|---|
能否区分对象的种类 | 不能 | 能 |
创建对象时是否必须用new关键字 | 不是 | 是 |
在下面的代码中实践中,会结合上述表格中的对比进行。
一.工厂方法:
使用步骤:
①创建函数:
创建一个名为 createPerson的函数,如下(在函数体中先创建一个对象obj,然后向obj对象中添加属性)
function createPerson(name, sex, gender){
var obj = new Object();//在函数中创建一个对象
obj.name = name;//此处的this 指的是 新创建出来的对象
obj.sex = sex;
obj.gender = gender;
obj.sayName = function func1(){
console.log("我叫" + this.name + ",性别:" + this.sex + ",今年" + this.gender + "岁了");//这里面的this指的是 新创建的对象。例如下面 ② 中的obj1,就是新创建的对象,那时,this指的是obj1
};
return obj;//如果不返回对象obj,创建出来的结果为“undefined”
};
②调用函数,创建对象
直接在在函数中传入参数,无需使用new关键字
var obj1 = createPerson("孙悟空","男",18);//创建对象时,是否用new关键字都可以 (var obj1 = new createPerson("孙悟空","男",18);)
var obj2 = createPerson("猪八戒", "男",20);
③打印对象的属性或者方法,显示结果:
例如:显示出obj1的name属性值,并且调用一下obj2的sayName()方法
console.log("打印obj1.name的结果是:" + obj1.name);
obj2.sayName();
//下面看一下,obj1 是否是 createPerson类?
console.log(obj1 instanceof Object);//结果是 true。说明obj1是Object类。
console.log(obj1 instanceof createPerson)//结果是 false。说明obj1不是createPerson类的实例,不会有自己类。即使obj1是createPerson函数创建出来的对象
④后台结果如下:
二.构造方法
构造函数(或者最好称为构造方法): 需要用new关键字去创建对象的函数
使用步骤:
①创建函数
创建一个 Person 的类。
function Person(name,age,gender){
this.name = name; //此处的this 指的是 新创建的对象,下同
this.age = age;
this.gender = gender;
this.func = function(){
// alert("Person类");
console.log("我叫" + this.name + ",性别:" + this.sex + ",今年" + this.gender + "岁了");
}
};
②创建对象
这里创建两个对象 per1 和 per2,
为了特地看一下构造方法中创建对象是否必须使用new关键字,在创建per1时,没有new关键字。而在创建per2时,使用到new关键字。
var per1 = Person("相博文",18,"男");
var per2 = new Person("奔波霸",28,"男");
③在后台打印一下结果
补充一个小点:instanceof的具体作用是测试左边的对象是否是右边类或者该类的子类创建的实例对象,是,则返回true。否,则返回false。
console.log("per1的是:" + per1);//结果是false。由于在构造方法中创建per1对象是,没有使用new关键字。
console.log("per2的是:" + per2);//结果是true。创建per2对象时,使用了new关键字。
console.log(per2 instanceof Object);//结果是true。per2是属于Object类的。
console.log(per2 instanceof Person);结果是true。说明在Person方法中可以有属于自己的类。
④查看一下后台打印的结果:
我们会发现,在构造方法中,没有用new去创建对象的话,后台打印时,会返回"undefined"。
很显然,在构造方法中,没有用new关键字去创建对象的话,结果返回的是undefined,所以在构造方法中,创建对象时必须使用new关键字
另外,应该注意:工厂方法和构造方法虽然创建的都是普通函数,但是函数体内的语句是有区别的,例如:工厂方法的函数体中需要用new创建一个都对象obj,并且最后返回它。而构造方法中是直接用this关键字来添加属性的