1 面向對象操作
- 回顧對象的基本概念
- 面向對象的相關概念
- 面向對象的特征和操作的實現方式
- 小練習
2 函數的相關內容
- 函數的屬性和方法
- 函數的其他使用方式
- 自調用函數
- 回調函數
- 閉包函數
- 遞歸函數
3 正則表達式
- 介紹:是一個用來操作字符串的工具(內置對象)
- 對象的創(chuàng)建方式
- 單個對象創(chuàng)建方式:{} new Object()
- 多個對象創(chuàng)建方式:
- 內置對象
- Array
- Date
- String
- 自定義構造函數
- 使用方式
- 命名規(guī)則:首字母大寫
- 調用規(guī)則:調用前必須設置new
- 內部操作:通過this給對象設置屬性或方法
- new的作用:
- 創(chuàng)建了一個對象
- 將對象返回
- 將this修改為這個對象
- 調用構造函數
- 推薦無論如何都要添加()
- this的使用:
- 全局作用域中:window對象,沒用
- 普通調用的函數中
- 默認this為window泽疆,也沒用
- 作為方法調用的函數中(使用最多的情況) (重要<俣帷!!)
- 默認this為當前對象(函數調用者)
- 構造函數中的this (固定用法)
- 被new設置為對象供汛,我們無法操作
- 對象的基本操作
- 分類:
JavaScript的數據類型分為2類
- 簡單類型(基本類型)
- string 字符串
- number 數值
- boolean 布爾
- null 空
- undefined 未定義
- 復雜類型
- Object
- Array
- Date
- Math
- String
- 自定義類型(自定義構造函數)
Js中只有對象一種復雜類型痢虹,因為內置功能很多,
根據具體的功能分類檐晕,有劃分為了多種類型
- 對象的使用分類:
- 數據存儲功能
- 數組: []
有序的數據存儲方式
- 對象: {}
無序的數據存儲方式
- 適用于數據需要進行單獨標識的場景
- 作為工具使用
- 見前面的復雜類型部分
- 對象的屬性操作
- 概念:對象是由屬性組成的,屬性由屬性名和屬性值組成
- 方法:方法也是屬性,只是保存了函數值辟灰,為了區(qū)分个榕,起了個新名字而已。
- 操作方式
- 對象.屬性名
- 對象['屬性名']
- 屬性名為字符串值芥喇,或通過變量保存時西采,必須使用這種方式
- 遍歷
- 遍歷方式: for..in
- 刪除方式:
delete 對象.屬性名; 刪除了屬性
// w3c標準和ECMA標準的關系?
// - ECMA標準:js基礎語法標準
// - w3c標準:html乃坤、css苛让、webAPI
*/
// 面向對象的概念:
// - 面向過程
// - 指的是在編程中,專注于實現功能的'過程'湿诊,專注于實現的具體的細節(jié)狱杰。
// - 例如:冒泡排序,需要考慮有幾個循環(huán)厅须,每個循環(huán)多少次仿畸,怎么比較和交換。朗和。
// - 面向對象(拿來主義)
// - 指的是在編程中错沽,考慮效果中需要使用哪幾部分功能,找到可以幫助我們實現功能的工具(對象)進行操作即可眶拉。
// - 例如:操作中需要對某個數組排序千埃,找到數組的sort方法,直接排序后進行后續(xù)操作即可忆植。
// 能不能說面向對象操作比面向過程好呢放可?
// - 不是一個層面的考慮方式,無法直接比較朝刊。
// - 例如:我們使用sort是一種面向對象的操作形式耀里,但是sort功能在實現時也是通過面向過程來操作的。
// - 我們可以將兩個部分的關系理解為:面向對象是基于面向過程的拾氓。
/*
var arr = [5, 2, 3, 1];
arr.sort();
console.log(arr); */
// 吃飯: 自己做飯(面向過程)冯挎、 去飯館吃飯(面向對象)
// 回憶以前我們做過的操作屬于哪種使用方式:
// - 面向過程:以前的大部分代碼都是面向過程的
// - 面向對象:內置對象操作,jQuery
// 面向對象操作的3個特征:
// - 封裝:指的是對象的封裝
// - 以前的封裝是函數封裝咙鞍,現在的封裝是對象的封裝房官,
// 其實就是基于函數封裝操作,將功能分類后保存到對象中進行使用续滋。
// - 繼承:
// - 為了實現更好的功能復用(jack和jack爸爸的例子)
// - 多態(tài):
// - 一個功能被不同對象操作時易阳,操作效果不同
// 將math相關的功能保存到obj中,就實現了基本函數封裝的對象封裝操作
/* var obj = {
mathFun1 : function () {
// 求和功能
},
mathFun2 : function () {
// 計算差功能
},
mathFun3 : function () {
// 計算乘法功能
}
}; */
/* function CreateObj (name, age) {
this.name = name;
this.age = age;
this.sayHi = function () {
console.log('你好,我的名字是' + this.name);
};
} */
// 通過new的方式可以創(chuàng)建具有構造函數中功能的對象
// 我們將這種對象稱為'實例對象'
/* var c1 = new CreateObj('jack', 18);
var c2 = new CreateObj('rose', 21); */
// 通過觀察我們發(fā)現c1和c2兩個實例對象的屬性值不同吃粒,很正常
// c1和c2的sayHi方法值相同不?
// console.log(c1, c2);
/* console.log(c1.sayHi);
console.log(c2.sayHi); */
// 通過觀察我們發(fā)現c1和c2的sayHi方法值長得一樣拒课,但推測不是同一個函數
// - 可以通過==或===進行比較
// - 注:對復雜類型進行==或===比較時徐勃,必須是同一個值才能返回true
/* console.log(c1.sayHi == c2.sayHi); // false事示,說明不是同一個函數
console.log(c1.sayHi === c2.sayHi); // false,說明不是同一個函數 */
// 出現的問題:函數的作用是重用僻肖,操作時不應當設置多個相同功能的函數
// 解決方式:將方法值設置為命名函數統(tǒng)一保存肖爵,讓功能可以重用
vartemp= {
sayHi:function() {
console.log('你好,我的名字是'+this.name);
},
sayHehe:function() {
console.log('你好,我的名字是'+this.name);
}
};
functionCreateObj(name,age) {
this.name=name;
this.age=age;
// 將sayHi函數體設置給this.sayHi
this.sayHi=temp.sayHi;
this.sayHehe=temp.sayHehe;
}
varc1=newCreateObj('jack',18);
varc2=newCreateObj('rose',21);
// 檢測后:c1和c2的sayHi是用一個函數,達到了改進的目的
console.log(c1.sayHi===c2.sayHi);// true
// 新的問題:
// - 為了優(yōu)化構造函數臀脏,設置了命名函數保存劝堪,這些函數被自動設置為window的方法
// - window的方法變多了,導致執(zhí)行速度變慢..
// - 任意的一個對象揉稚,屬性越多秒啦,訪問的速度越慢
// 解決方式:
// - 設置一個臨時的對象,用來統(tǒng)一保存構造函數中的方法值
// prototype 原型
// - 任意函數都自帶prototype屬性
// prototype的值搀玖,默認就是一個對象余境,就是用來保存構造函數中的方法使用的灌诅。
functionCreateObj(name) {
this.name=name;
this.age=18;
this.hobbies= ['吃','喝'];
// 之前的方法設置方式:
/*
this.sayHi = function () {
console.log('你好,我的名字是' + this.name);
};
this.sayHehe = function () {
console.log('呵呵呵');
};
*/
}
// console.log(CreateObj.prototype);
// 以后的方法設置方式:
// - 考慮某個函數中的this時猜拾,一定先考慮函數是如何執(zhí)行的
CreateObj.prototype.sayHi=function() {
console.log('你好,我的名字是'+this.name);
};
CreateObj.prototype.sayHehe=function() {
console.log('呵呵呵');
};
varc1=newCreateObj('jack',18);
varc2=newCreateObj('rose',21);
c1.sayHi();// c1在調用sayHi方法挎袜,sayHi中的this就是c1
c2.sayHi();// c2在調用sayHi方法,sayHi中的this就是c2
// console.log(c1.sayHi === c2.sayHi); // true
// 小結論:
// 將方法設置給prototype后宋雏,實例對象可以直接使用,也是統(tǒng)一保存的方法值
// - 以后設置方法時磨总,統(tǒng)一設置給 構造函數.prototype 即可
// 對象屬性的基本查找方式:
// - 1 查找對象自身,如果存在蚪燕,就使用
// - 2 如果沒有對應功能娶牌,在查找__proto__馆纳,也就是構造函數的原型
// - 如果原型中存在對應功能诗良,也可以使用
// 從語法角度觀察,Array是構造函數鲁驶,arr就是實例對象
vararr=newArray(1,2,3,4,5);// 相當于[1, 2, 3, 4, 5]
arr.push(8);
console.log(arr);
// 通過觀察arr鉴裹,我們發(fā)現內置對象設置方法時,采用的方式與我們相同,都是設置在了prototype中
// 如果我們希望給內置構造函數Array增加方法径荔,設置在Array.prototype中即可
// 例如:設置一個用于數組求和的方法
/* function getSum (arr) {
var sum = 0;
for (var i = 0; i < arr.length; i++) {
sum += arr[i];
}
return sum;
}
console.log(getSum(arr)); */
// 將getSum設置為數組的方法督禽,任意數組均可使用
Array.prototype.getSum=function() {
varsum=0;
for(vari=0;i<this.length;i++) {
sum+=this[i];
}
returnsum;
};
console.log(arr.getSum() );
// 我們自己書寫的代碼可以在控制臺輸出查看
// 例如: console.log(arr.getSum);
// 內置的功能無法查看代碼,查看結果為 ? push() { [native code] }
// 例如: console.log(arr.push);
// 實際使用方式:
// - 這個屬性是給示例對象訪問的总处,用來確定實例對象是通過哪個構造函數創(chuàng)建的狈惫。
// - 功能作用:類型檢測操作
// typeof 只能檢測除null的簡單類型和function
// instanceof
// - 以后希望確定當前對象的類型時,檢測constructor即可鹦马,比instanceof好用一些
// - constructor的作用非常單純胧谈,就是用來檢測類型,確定了類型就確定了功能
// 作用域鏈回顧:
// - 作用:用來描述變量名/函數名的查找方式
// - 沿作用域鏈查找
// - 查找的最終位置:全局作用域
// 原型鏈:
// - 原型鏈是由一個或多個原型組成的結構荸频。
// - 作用:用來描述對象屬性的查找方式
// - 查找方式:沿原型鏈查找
// - 查找的最終位置:Object.prototype