面向对象
概念
类和对象区别
类:类型的简称,类型~数据类型的简称,就是一个代号,一种数据类型的描述,如:人~
对象:就是类型的某一个具体的实体,一个具体已经存在实际的物体!
类是对象抽象出来的一个概念
对象是类型指代的具体存在的某一个物体
>>> JSON分装就面向对象的思想来说,存在一定的缺陷
kangKang[对象]和People[类]之间没有任何关系
kangKang[对象]和houZi[对象]之间没有任何关系
这样的封装模式下,如果对象比较多,就会让代码的复杂度提升的非常严重
特性:
> 对零散数据的封装,方便对数据进行统一的管理和支配,避免了零散数据可能出现的数据污染> 提高代码的复用性【重复使用的特性】
> 降低代码之间的耦合【耦合:依赖】,提高代码的健壮性
> 提高项目的扩展性【软件开发的OCP原则:开闭原则】
过程:
> 面向对象分析 OOA> 面向对象设计 OOD
> 面向对象编程 OOP
> 面向对象测试 OOT
特征:
> 封装:将零散数据封装起来,进行统一的管理和支配
> 继承:通过不同对象之间的关联关系,来完成提升代码复用性和扩展性的目的
> 多态:运行的过程中,对象在不同的环境下回表现出不同的状态
使用范围:
> 不要在小效果上使用面向对象
> 不要在独立的效果上使用面向对象
>> 通常情况下,在项目中进行公共效果的开发和批量数据的处理时,使用面向对象简化开发
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script>
// 定义一个Summer 2个变量用来描述一个人物对象
var _name="Summer";
var _age=18;
var _sex="女";
var _name2="Jack";
var _age2=19;
var _sex="男";
//对零散对象的封装 通过Jeson
var people={
name:"",
age:0,
sex:""
};
var buling={};
buling.name="Summer";
buling.age=18;
buling.sex="女"
var baba={};
buling.name="Jack";
buling.age=19;
buling.sex="男"
console.log(buling);
console.log(baba);
//第二种封装:解决第一种封装中由于代码的重复量造成的复杂度的提升
function People(name,age,sex){
return{
name:name,
age:age,
sex:sex
}
}
var bulinglig=People("Summer",19,"女");
var balabla=People("Jack",18,"男");
console.log(bulinglig,balabla);
* 面向:设身处地
* 面向对象:当你就是将要封装的对象,你自己会有哪些特征,会有哪些行为
* 站在对象的角度思考问题~面向对象 Oriented Object 分析过程
*
* 1.人民的名义
* 侯亮平 陈海 季昌明
*
* 抽象/抽取:姓名、性别、检察官
*
* 2.打砖块
* 砖块
* 抽象:
* 特征:宽度、高度、背景颜色、位置left、位置top
* 行为:消失
*/
var brick={
width:"100px",
height:"10px",
backgroundColor:"orange",
left:"0px",
top:"0px",
dis:function(){
console.log("消失了...");
}
}
/**
* 定义一个函数:人的类型
* 通过函数定义了一个类型
* 使用了 this.属性 这样的语法结构
* 这个函数,就被称为构造函数
* 构造函数:专门被用来创建对象的函数
*
* 如果通过构造函数创建对象,使用new关键字来进行对象的创建
* @param name 姓名
* @param age 年龄
* @param gender 性别
*/
var People=function(name,age){
this.name=name;
this.name=age;
this.search=function(){
console.log("搜查令...");
}
}
var bulinglig=People("Summer",19,"女");
var balabla=People("Jack",18,"男");
/*
实例对象,有一个constructor属性,指向的是创建自己的构造函数
*/
// 两个对象之间的关系,都是通过同一个构造函数创建出来的
// console.log(houZi.constructor);
// console.log(chenHai.constructor);
// console.log(houZi.constructor == chenHai.constructor);
// 对象和类型之间的关系,对象是否某种类型:通过instanceof 关键字来判断
console.log(bulinglig instanceof People);//bulinglig是否是People类型
console.log(balabla instanceof People);//balabla是否是People类型
//变量中存储的都是基本类型的数据
var x=1;
var y=12;
var z=x+y;
console.log(z);
</script>
</html>
继承
什么是继承:
在继承中,会出现两个类型【父类、子类,子类继承父类的属性和行为】继承是用来做什么的
继承是通过子类继承父类实现父类中代码的重复利用!继承的使用注意事项:
尽量让一个父类有一个或者多个子类一个子类只继承一个父类
继承的方式:
apply/call方法都是通过改变函数中第一个参数的指向来达到扩展代码功能的目的
唯一的区别就是apply和call后面的参数不一样!
封装
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
</body>
<script>
/*
常规情况下,对于对象的封装
将属性封装在构造函数的内部
将行为定义到构造函数的prototype上面
*/
var People=function (name,age) {// 构造函数中只封装属性
this.name;
this.age;
}
People.prototype.run=function(){};
People.prototype.sleep=function(){};
People.prototype.play=function(){};
/* prototype 的使用 */
// 取最大数 用数组
Array.prototype.getMax=function () {
var _max=this[0];
for(var i=0;i<this.length;i++){
if(this[i]>_max){
_max=this[i];
}
}
return _max;
}
var _arr=[1,2,3,4,15,80];
console.log(_arr.getMax());
</script>
</html>
封装的好处:
(1)将外界的变化隔离,使程序具备独立、安全和稳定性。(2)便于设计者使用,提高代码的复用性。
封装的原则
(1)将不需要对外提供的内容都隐藏起来。(2)把实现细节隐藏,提供可以对其进行访问公共的方式。