构造函数模式的目的就是为了创建一个自定义类,并且创建这个类的实例
function CreateJsPerson(name,age){ // 浏览器默认创建的对象就是我们的实例p1 -》 this this.name = name; // p1.name = name this.age = age; this.writeJs = function () { console.log("my name is" + this.name) }
// 浏览器再把创建的实例默认的进行返回 } var p1 =new CreateJsPerson("张三",20); //CreateJsPerson中的this是当前实例p1
p1.writeJs(); // writeJs中的this是p1
var res = CreateJsPerson("aaaa",30); // 这样写不是构造函数模式执行而是普通的函数执行,由于没有写return所以res= undefined,并且CreateJsPerson这个方法中的this是window
console.log(res) // undefined
var p2 =new CreateJsPerson("李四",30);
p2.writeJs();
构造函数模式和工厂模式的区别:
1.执行的时候
普通函数执行: createJsPerson()
构造函数模式执行: new CreateJsPerson() 通过new执行后,我们的CreateJsPerson就是一个类了
而函数执行的返回值(p1)就是CreateJsPerson这个类的一个实例
2.在函数代码执行的时候
相同点: 都是形成一个私有作用域,然后经历形参赋值,预解释,代码开始从上到下执行(类和普通函数一样,它也有普通函数的一面)
不同点:1)在代码执行之前,不用自己在手动的创建obj对象了,浏览器会默认的创建一个对象数据类型的值(这个对象其实就是我们当前类的一个实例),
2)接下来代码从上到下执行,以当前实例为执行的主体(this代表的就是当前的实例),然后分别把属性名和属性值赋值给当前的实例
3)最后浏览器会默认的把创建的实例返回
引入知识点:
1.创建一个数组:
var ary = [] // 字面量方式
var ary = new Array(); // 实例创建的方式 -》构造函数模式执行的方式
不管哪一种方式ary都是Array这个类的一个实例
2.JS中所有的类都是函数数据类型的,它通过new执行变成了一个类,但是它本身也是一个普通的函数
JS中所有的实例都是对象数据类型的
3.在构造函数模式中,类中(函数体中)出现的this.xxx = xxx 中的this是当前类的一个实例
4.p1和p2都是 CreateJsPerson这个类的实例,所以都拥有writeJs这个方法,但是不同实例之间的方法是不一样的
在类中给实例增加属性(this.xxx = xxx)属于当前实例的私有属性,实例和实例之间是单独的个体,所以私有属性之间是不相等的
console.log(p1.writeJS === p2.writeJS) ->false