JS面向对象之最常用创建对象的方式面向对象之最常用创建对象的方式
目录目录
基本模式
工厂模式
构造函数模式
原型模式
组合模式(构造函数和原型模式组合)
动态原型模式
基本模式基本模式
我们都知道,创建对象的方法本质上都是把”属性”和”方法”,封装成一个对象。普通创建对象的方法有缺陷,比如,如果创建
多个对象会比较繁琐,效率低;实例与原型之间,没有任何办法可以看出有什么联系。如下:
var people1=new Object();
people1.name='孙悟空';
people1.weapon='金箍棒';
//this是指的当前作用域下的对象,注意和谁调用这个方法有关,和在哪定义没啥关系
//这里也可以简单理解为this就指的这个函数属于谁,属于谁this就是指的谁
people1.run=function(){
return this.name+'的武器是'+this.weapon;
}
alert(people1.name);
alert(people1.run());
//该方法如果创建多个对象就会比较繁琐,如下......
var people2=new Object();
people2.name='猪八戒';
people2.weapon='九齿钉耙';
people2.run=function(){
return this.name+'的武器是'+this.weapon;
}
alert(people2.name);
alert(people2.run());
工厂模式工厂模式
所以为了解决重复创建多个对象的麻烦,我们用工厂模式的方法来创建对象,上面的方式我们称为基本模式。那先来解释一下
什么是工厂模式:创建并返回特定类型的对象的工厂函数(其实就是普通函数,没啥区别,只是叫法不同)。创建过程类似于工
厂生产产品的过程,即:原材料--加工--产品...(之后会在代码里详细解释)工厂模式解决了多次重复创建多个对象的麻烦。
(工厂模式其实就是把创建对象的过程封装到一个函数里面)
//工厂模式
function createPeople(name,weapon){
var people=new Object();//可以类比为加工对象的原材料
people.name=name;
people.weapon=weapon;
people.run=function(){
return this.name+'的武器是'+this.weapon;
} //以上步骤可以类比为加工对象的过程
return people;//注意一定要将创建的对象返回
//可以类比为产品加工完毕出厂的工作
}
var wukong=createPeople('孙悟空','金箍棒');
var bajie=createPeople('猪八戒','九齿钉耙');
alert(wukong.run());
alert(bajie.run());
但这种方式同样存在一些弊端:
创建出的实例之间没有内在的联系,不能反映出它们是同一个原型对象的实例。
创建对象的时候没有使用 new 关键字(这里我们先埋下伏笔,之后会有详细解释)
会造成资源浪费,因为每生成一个实例,都增加一个重复的内容,多占用一些内存。