原型鏈
原型鏈?zhǔn)侵笇ο笤谠L問屬性或方法時的查找方式璧坟。
????1.當(dāng)訪問一個對象的屬性或方法時既穆,會先在對象自身上查找屬性或方法是否存在,如果存在就使用對象自身的屬性或方法雀鹃。如果不存在就去創(chuàng)建對象的構(gòu)造函數(shù)的原型對象中查找?循衰,依此類推,直到找到為止褐澎。如果到頂層對象中還找不到会钝,則返回?undefined。
????2.原型鏈最頂層為?Object?構(gòu)造函數(shù)的?prototype?原型對象工三,給?Object.prototype?添加屬性或方法可以被除??null?和?undefined?之外的所有數(shù)據(jù)類型對象使用迁酸。
????????????????構(gòu)造函數(shù)?prototype
????????????????原型鏈?__proto__
hasOwnProperty():看是不是對象自身底下的屬性
contructor查看對象的構(gòu)造函數(shù)?可以用來做判斷
instanceof:對象與構(gòu)造函數(shù)是否在原型鏈上有關(guān)系
toString()判斷類型;??轉(zhuǎn)換字符串??進(jìn)制轉(zhuǎn)換
hasOwnProperty?判斷鍵名是否是對象自身的屬性
call俭正、apply奸鬓、bind?改變this指向
call??傳參的區(qū)別,傳字符串
apply??傳數(shù)組
bind??后面一個括號不能省略? ? ? ? ??(bind不加括號掸读,改變指向但是現(xiàn)在不執(zhí)行)
繼承:子類繼承父類所有屬性和行為串远,父類不受影響。
目的:找到類之間的共性精簡代碼
繼承
原型繼承
簡單原型繼承,出現(xiàn)影響父類的情況? ? ??
傳值和傳址
傳址:?復(fù)雜數(shù)據(jù)類型儿惫;?Array??Date?Math?RegExp?Object?Function等澡罚;? ? ? ??傳址,在內(nèi)存中在同一個地址肾请,只是名稱不同留搔,會相互影響
傳值:?簡單數(shù)據(jù)類型:number?string?boolean?null?undefined;
避免傳址? ? ?(深拷貝)
方式一:新建一個對象,把對象放進(jìn)去铛铁,跟原來的對象地址不一樣隔显,不會相互影響
function?deepCopy(obj){
????let?newObj?=?Array.isArray(obj)?[]:{};
????for(let?key?in?obj){
????????if(obj.hasOwnProperty(key)){
????????????if(typeof?obj[key]?===?"object"){
????????????????newObj[key]?=?deepCopy(obj[key])?
????????????}else{
????????????????newObj[key]?=??obj[key];
????????????}
????????}
????}
????return?newObj;
}
方式二:組合繼承
function?Dad(){
??????this.name?=?"張三";
??}
??Dad.prototype.hobby?=?function(){
??????console.log("喜歡籃球");
??}
??function?Son(){
??????Dad.call(this);
??}
??let?F?=?function(){}
??F.prototype?=?Dad.prototype;
??Son.prototype?=?new?F();
??Son.prototype.constructor?=?Son;
??let?newSon?=?new?Son();
??newSon.hobby();
方式三:序列化和反序列化却妨;深拷貝
不推薦,如果拷貝對象包含函數(shù)括眠,或者undefined等值彪标,此方法就會出現(xiàn)問題
let?obj?=?[1,2,3]
????????let?obj1?=?JSON.parse(JSON.stringify(obj));
????????????????JSON.stringify:把對象或者數(shù)組??轉(zhuǎn)換成?json串;
????????????????JSON.parse?:把json串轉(zhuǎn)換成對象掷豺;