构造函数模型
案例一
>>工厂模式
function creatjsPerson(name,age){
var obj={
};
obj.name=name;
obj.age=age;
obj.writeJs=function(){
console.log("my name is "+this.name +",i can write js");
};
return obj;
}
var p1=cretejsperson("小白",18);
p1.writeJs();
var p1=cretejsperson("大白",28);
p2.writeJs();
构造函数模式的目的解释为了创建一个自定义函数和它的实例
案例二
>>构造函数
function creat(name, age){
obj.name=name;
obj.age=age;
obj.write=function (){
console.log("i can write"+obj.name);
};
}
var p1=new creat("xiaobai",13);
p1.write();
var p2=new creat("xiaohei",15);
p2.write();
构造函数模式与工厂模式的区别:
1、执行的时候
普通函数执行 creatjsPerson()
构造函数模式 new creatjsPerson() 通过new执行后,creatjsPerson就是一个类
案例三
创建一个数组:
var ary =[];
>>字面量方式
var ary = new array();
>>实例创建的方式
>>构造函数模式执行的方法
不管哪一种方式ary都是array这个类的一个实例
2、在函数代码执行的时候
相同:都是形成一个私有作用域 形参赋值——预解释——代码从上到下执行(类和普通函数一样,有普通的一面)
不同:在代码执行的之前,不用手动创建一个对象,浏览器会默认的创建一个对象数据类型的值(这个对象就是当前类的实例),接下来代码从上到下执行,以当前的实例为执行的主体(this),把属性名、属性值赋值给实例,最后,浏览器会默认返回实例
案例二拓展
function creat(name, age){
//p1 浏览器默认创建>>this
this.name=name;
//p1.name=name;
this.age=age;
this.write=function (){
console.log("i can write"+this.name);
};
}
>>浏览器把创建的实例默认的进行返回
var p1=new creat("xiaobai",13);
p1.write();
var p2=new creat("xiaohei",15);
p2.write();
结论
1、
js中所有的类都是函数数据类型,通过new变成了一个类,但是本身也是一个普通的函数
js中所有的实例都是对象数据类型
2、
this的第四种形式>>day four
在构造函数中,类中(函数体中)出现this.xxx=xxx,中的this代表这个类的实例
3、
p1、p2都是creat的类的实例,都有write的方法,都是不同实例的方法不一样
在类中给实例增加的属性(this.xxx=xxx)属于当前实例的私有的属性,实例和实例之间是单独的个体,所以私有的属性之间是不相等的
console.log(p1.write === p2.write);>>false
案例三
var p1=cretejsperson("小白",18);
>>creatjsPerson>>this p1
p1.writeJs();
>>writeJs>>this p1
var res = creatjsPerson("小黑",17);
>>这样写不是构造函数模式执行,而是普通函数模式执行,由于没有写return,所以res=undefined,并且creatjsPerson这个方法中的this是window
console.log(res);
>>undefined