目录
JavaScript中有四种常见的设计模式 ,目的是为了批量创建对象 为了实现继承。
利用工厂模式批量创建对象
优点:可以批量创建对象
缺点:无法区分种类,创建实例对象都是Object实例,方法冗余
- var sayName = function(){
- console.log(this.name)
- };//b1001
- function Person(name,age,gender){
- return {
- name:name,
- age:age,
- gender:gender,
- sayName:sayName
- }
- }
- var p1 = Person('terry',12,'male');
- var p2 = Person('larry',18,'female');
- console.log(p1,p2);
- p1.sayName();
- p2.sayName();
- console.log(p1.sayName===p2.sayName);
-
- function Animal(){
- return {
-
- }
- }
- var a1 = Animal();
- console.log(a1);
代码运行结果如下:

优点:可以批量创建对象 可以区分种类 Person{} Animal{}
缺点:无法解决方法冗余
- var sayName = function(){
- console.log(this.name)
- }
- function Person(name,age,gender){
- // new Object() new Array()
- this.name = name;
- this.age = age;
- this.gender = gender;
- this.sayName = sayName;
- }
- var p1 = new Person('terry',12,'male');
- var p2 = new Person('larry',18,'female');
- console.log(p1,p2);
- console.log(p1.sayName===p2.sayName);
- p1.sayName();
- p2.sayName();
-
- function Animal(){
-
- }
- var a1 = new Animal();
- console.log(a1);
1.创建一个Person对应的实例
2.将this指向实例对象
3.执行函数体代码
4.返回实例对象
代码运行结果如下:

不单独使用 构造函数不做任何处理将实例所有属性和方法全部写在原型对象中
优点:可以区分种类 可以批量创建对象 方法不冗余
缺点:所有实例方法和属性一样
- function Person(){};
- Person.prototype.name = 'lisi';
- Person.prototype.age = 12;
- Person.prototype.gender = 'male';
- Person.prototype.sayName = function(){
- console.log(this.name);
- };
- Person.prototype.firends = [];
- var p1 = new Person();
- var p2 = new Person();
- console.log(p1,p2);
- console.log(p1.name,p2.name,p1.sayName(),p2.sayName());
- p1.firends.push('tom');
- console.log(p1.firends,p2.firends);
代码运行结果如下:
构造函数模式 + 原型模式
将实例私有属性和私有方法放在构造函数中
将实例公共属性和公共方法放在原型对象中
- function Person(name,age,gender,weight){
- // 私有属性
- this.name = name;
- this.age = age;
- this.gender = gender;
- // 私有方法
- this.weight = function(){
- console.log(weight)
- }
- }
- // // 公共方法
- // Person.prototype.sayName = function(){
- // console.log(this.name);
- // }
- // // 公共属性
- // Person.prototype.type = 'Person实例';
- // 简化上述代码
- Person.prototype = {
- // 将构造者改为Person
- constructor:Person,
- sayName:function(){
- console.log(this.name)
- },
- type:'Person实例'
- };
-
- var p1 = new Person('terry',16,'male','40kg');
- var p2 = new Person('larry',18,'female','60kg');
- p1.sayName();
- p2.sayName();
- console.log(p1.sayName === p2.sayName,p1.type === p2.type);
- console.log(p1.type,p2.type);
- p1.weight();
- p2.weight();
- console.log(p1.weight === p2.weight);
- console.log(p1.constructor,p2.constructor);
-
- // instanceof 检测实例在不在原型链中 是否是构造函数实例
- console.log(p1 instanceof Person);
- console.log(p1 instanceof Object);
- console.log(p1 instanceof Array);
- console.log(Person instanceof Object);
-
- function Animal(){};
- console.log(Animal instanceof Object);
代码运行结果如下: