<script>
//工厂模式
function createJsPerson(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 = createJsPerson("xiaobo", 16);
p1.writeJs();
//构造函数的目的就是为了创建一个自定义类,并且创建这个类的实例
//构造函数模式跟工厂模式的区别
function CreateJsPerson(name, age) {
// var obj = {};//默认创建 不需要手动创建
this.name = name;
this.age = age;
this.writeJs = function () {
console.log("my name is " + this.name + " I can write JS");
};
// return obj;//不需要手动返回,浏览器再把创建的实例默认的进行返回
}
var p1 = new CreateJsPerson("xiaobo", 16);
p1.writeJs();
var p2 = new CreateJsPerson("王小波",18);
p2.writeJs();
var res = CreateJsPerson("xx",11);//这么写不是构造函数模式而是普通的函数执行,由于没有写return所以res=undefined,并且CreateJsPerson中的this是window
//1.执行的时候
//普通函数执行->createJsPerson()
//构造函数执行->new CreateJsPerson() 通过new执行后,我们的CreateJsPerson()就是一个类了\
//而函数执行的返回值p1就是CreateJsPerson这个类的一个实例
//2.在函数代码执行的时候
//相同点:都是形成一个私有作用域,然后 形参赋值->预解释->代码从上到下执行(类和普通函数一样,他也有普通的一面)
//不同:在代码执行之前,不用自己手动创建obj对象了,浏览器会默认创建一个对象数据类型的值
//这个对象其实就是当前类的一个实例
//接下来代码从上到下执行,以当前的实例为执行的主题(this代表的就是当前的实例),然后分别的把属性名和属性
//值赋值给当前的实例
//最后浏览器会默认的把创建的实例返回
//创建一个数组:
var ary = [];//字面量方式
var ary = new Array();//实例创建的方式->构造函数模式执行的方式
//无论哪一种方式 ary都是Array这个类的一个实例
//在js中 所有的类 都是函数数据类型的,它通过new执行变成了一个类,但是它本身也是一个普通的函数
//js当中 所有的实例都是对象数据类型的
//2
//在构造函数模式当中,类中(函数体中)出现的this.xxx=xxx中的this是当前类的一个实例
//3.
//虽然p1和p2都是CreateJsPerson这个类的实例,所以都拥有writeJs这个方法,但是不同实例之间的方法是不一样的
//在类中给实例增加的属性(this.xxx=xxx)属于当前实例的私有的属性,实例和实例之间是单独的个体,所以私有的属性之间是不相等的.
console.log(p1.writeJS===p2.writeJs);//->false
</script>
构造函数模式
最新推荐文章于 2022-07-26 18:10:16 发布