面向对象编程(OOP)的特点
抽象:抓住核心问题
封装:不考虑内部实现,只考虑功能使用
继承:从已有对象上,继承出新的对象
对象的组成
方法——函数:过程、动态的
属性——变量:状态、静态的
工厂方式
function createPerson(name, qq) //构造函数
{
//原料
var obj=new Object();
//加工
obj.name=name;
obj.qq=qq;
obj.showName=function ()
{
alert('我的名字叫:'+this.name);
};
obj.showQQ=function ()
{
alert('我的QQ号:'+this.qq);
};
//出厂
return obj;
}
var obj=createPerson('Warren', '125779473');
var obj2=createPerson('张三', '45648979879');
以上便是工厂方式来构造一个类,但是发现我们并没有用new来创建这个类,如何用new来创建呢?把程序改成如下:
function createPerson(name, qq) //构造函数
{
//系统偷偷替咱们做:
//var this=new Object();
//加工
this.name=name;
this.qq=qq;
this.showName=function ()
{
alert('我的名字叫:'+this.name);
};
this.showQQ=function ()
{
alert('我的QQ号:'+this.qq);
};
//也会偷偷做一些:
//return this;
}
var obj=new createPerson('Warren', '125779473');
var obj2=new createPerson('张三', '45648979879');
obj.showName();
obj.showQQ();
alert(obj.showName==obj2.showName);
这样便可以用new来创建对象了。用new关键字来创建对象,类中的原本为window对象的this,现在成了一个object对象,并且程序会偷偷的帮我们做上述代码中注释掉的内容。
但是上面代码中的alert会返回一个false,也就是说showName方法被重复定义了,这会导致一个问题就是:消耗资源。为了解决上述的问题,我们需要引入js中的一个概念:原型——prototype。
什么是原型——prototype?
在解释什么是原型之前,我们先看一下css这里的东西:
<style>
.box{
background:red;
}
</style>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
<div class="box"></div>
这里我定义了一个css样式box,内容为背景红色,然后下面的每个div都加上了class属性并赋值为box,这样做效果是什么?我想大家都知道,就是所有的div的背景都赋上了box的样式,也就是红色背景。
说完上面的这个css的问题,我们回来说说什么是js里的原型,这里我不想给原型一个笼统的定义,我只想说js里的原型其实就相当于css中的class,即定义一个全局的方法供其子对象调用。
知道什么是原型之后,我们把上面的js方法进行如下改造:
function CreatePerson(name, qq) //构造函数
{
this.name=name;
this.qq=qq;
}
CreatePerson.prototype.showName=function () //原型
{
alert('我的名字叫:'+this.name);
};
CreatePerson.prototype.showQQ=function ()
{
alert('我的QQ号:'+this.qq);
};
var obj=new CreatePerson('Warren', '125779473');
var obj2=new CreatePerson('张三', '45648979879');
obj.showName();
obj.showQQ();
obj2.showName();
obj2.showQQ();
alert(obj.showName==obj2.showName);
这种构造的方式叫做混合的的构造函数/原型方式,alert的值终于是true了,也就是说2个子对象是用的同一个方法,这样就解决了上述的方法重复定义的问题了。类名记得遵循首字母大写的规范。
原型方式需要遵循2个原则:
构造函数:加属性 原型:加方法
Json方式的面向对象
所谓Json方式的面向对象,就是指把方法和属性包在一个Json里:
var json={
name: 'Warren',
qq: '125779473',
showName: function ()
{
alert('我的名字叫:'+this.name);
},
showQQ: function ()
{
alert('我的QQ号是:'+this.qq);
}
};
json.showName();
json.showQQ();
命名空间
所谓命名空间,其实就是把同一类的方法包在一起,可以解决方法重复命名问题,也使代码更加容易维护。
var warren={};
warren.common={};
warren.fx={};
warren.site={};
warren.common.getUser=function ()
{
alert('a');
};
warren.fx.getUser=function ()
{
alert('b');
};
warren.site.getUser=function ()
{
alert('c');
};
warren.common.getUser();
warren.fx.getUser();
warren.site.getUser();