JavaScript中的设计模式

目录

1.工厂模式

2.构造函数模式

构造函数中new关键字作用:

3.原型模式

4.组合模式


JavaScript中有四种常见的设计模式 ,目的是为了批量创建对象 为了实现继承。

1.工厂模式

利用工厂模式批量创建对象 
    优点:可以批量创建对象 
    缺点:无法区分种类,创建实例对象都是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);

 代码运行结果如下:



2.构造函数模式

    优点:可以批量创建对象 可以区分种类 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);
构造函数中new关键字作用:

        1.创建一个Person对应的实例 
        2.将this指向实例对象
        3.执行函数体代码
        4.返回实例对象

代码运行结果如下:


3.原型模式

    不单独使用    构造函数不做任何处理将实例所有属性和方法全部写在原型对象中

        优点:可以区分种类 可以批量创建对象 方法不冗余

        缺点:所有实例方法和属性一样

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);

代码运行结果如下:


4.组合模式

      构造函数模式 + 原型模式
      将实例私有属性和私有方法放在构造函数中
      将实例公共属性和公共方法放在原型对象中

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);

代码运行结果如下:


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值