面向對象
概念
類和對象區別
類:類型的簡稱,類型~數據類型的簡稱,就是一個代號,一種數據類型的描述,如:人~
對象:就是類型的某一個具體的實體,一個具體已經存在實際的物體!
類是對象抽象出來的一個概念
對象是類型指代的具體存在的某一個物體
>>> 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)把實現細節隱藏,提供可以對其進行訪問公共的方式。