1腔召、面向?qū)ο蟮娜筇卣鳎悍庋b、繼承扮惦、多態(tài)臀蛛。
? 封裝:就是將方法封裝在對(duì)象中,只給出接口就可以調(diào)用崖蜜,利于維護(hù)浊仆,避免全局對(duì)象污染,
? 繼承:混入式繼承(mix-in),for(var i in),將一個(gè)對(duì)象繼承給例外一個(gè)對(duì)象豫领。
原型繼承:利用原型對(duì)象中的成員可以被和其相關(guān)的對(duì)象共享這一特性抡柿。
? 多態(tài):父類引用指向子類的對(duì)象(javascript中用不到)
2、創(chuàng)建對(duì)象的四種方式
? 1)氏堤、使用字面量創(chuàng)建對(duì)象: var obj = {value:1,name:'hyl'},缺點(diǎn):用一個(gè)創(chuàng)建一個(gè)沙绝,造成資源浪費(fèi)
? 2)、使用內(nèi)置的構(gòu)造函數(shù)創(chuàng)建對(duì)象:var obj = new Object();創(chuàng)建了一個(gè)空的對(duì)象鼠锈,然后添加成員闪檬,obj.name = '1',
? ? ? 缺點(diǎn):創(chuàng)建的是一個(gè)空的對(duì)象,還要將對(duì)象添加屬性购笆,造成代碼重復(fù)粗悯。
? 3)、封裝簡(jiǎn)單的工廠函數(shù)(不推薦使用)
? ? ? function createObj(name,age){
? ? ? ? let obj = {} 或者 obj = new Object();
? ? ? ? obj.name = name;
? ? ? ? obj.age = age;
? ? ? ? return obj;
? ? ? }
? 4)同欠、自定義構(gòu)造函數(shù)
? function 構(gòu)造函數(shù)名{
this.name = name;
....
? }
? 0.構(gòu)造函數(shù)名首字母需要大寫
? 1.構(gòu)造函數(shù)一般和new關(guān)鍵字一起使用
? 2.構(gòu)造函數(shù)的返回值默認(rèn)為新創(chuàng)建的對(duì)象样傍,如果手動(dòng)返回基本數(shù)據(jù)類型横缔,則不影響返回值,如果返回的是對(duì)象(除了null)衫哥,則新建出來的對(duì)象不會(huì)返回
取而代之的是return 后面的對(duì)象茎刚。
? 構(gòu)造函數(shù)(constructor)的執(zhí)行步驟:
? 1.使用new關(guān)鍵字來創(chuàng)建一個(gè)對(duì)象。
? 2.調(diào)用構(gòu)造函數(shù)撤逢,將new創(chuàng)建出來的對(duì)象賦值給構(gòu)造函數(shù)內(nèi)的this.
? 3.使用this給新創(chuàng)建出來的對(duì)象賦值
? 4.默認(rèn)返回新創(chuàng)建出來的對(duì)象
3膛锭、原型
? 構(gòu)造函數(shù)存在的問題:
? 構(gòu)造函數(shù)中的方法,每創(chuàng)建一個(gè)對(duì)象的時(shí)候蚊荣,該對(duì)象都會(huì)重新的創(chuàng)建一次這個(gè)方法初狰,每個(gè)獨(dú)享獨(dú)占一個(gè)方法,
? 但是該方法的內(nèi)容完全相同互例,所以造成資源浪費(fèi)奢入。
? 1.解決方法1
將構(gòu)造函數(shù)的方法,進(jìn)行提取媳叨,放在構(gòu)造函數(shù)的外面腥光,在構(gòu)造函數(shù)內(nèi)部進(jìn)行引用賦值。
那么創(chuàng)建出來的對(duì)象肩杈,都會(huì)指向構(gòu)造函數(shù)外面的這個(gè)函數(shù)柴我,達(dá)到共享的效果。
問題:全局變量越來越多扩然,造成全局變量污染艘儒,代碼結(jié)構(gòu)混亂,不容易維護(hù)夫偶。
? 2.解決辦法2
? ? 使用原型
4界睁、原型是什么?
在構(gòu)造函數(shù)創(chuàng)建出來的時(shí)候兵拢,系統(tǒng)默認(rèn)會(huì)創(chuàng)建一個(gè)關(guān)聯(lián)的對(duì)象翻斟,這個(gè)對(duì)象就是原型,原型對(duì)象默認(rèn)為空對(duì)象
默認(rèn)的原型對(duì)象中會(huì)有一個(gè)屬性 constructor指向該構(gòu)造函數(shù)说铃。
5访惜、原型的作用
原型對(duì)象中的成員,可以被使用和它關(guān)聯(lián)的構(gòu)造函數(shù)創(chuàng)建出來的所有對(duì)象共享
6腻扇、原型對(duì)象的使用:
1.使用動(dòng)態(tài)屬性特性债热,為原型添加成員變量。
2.直接替換原型對(duì)象幼苛。
注意事項(xiàng):直接替換原型對(duì)象窒篱,會(huì)導(dǎo)致替換之前創(chuàng)建的對(duì)象的原型和替換之后創(chuàng)建的對(duì)象的原型不一致。
7、原型的使用注意事項(xiàng)
1.使用對(duì)象訪問屬性的時(shí)候墙杯,會(huì)去現(xiàn)在的對(duì)象中查找配并,如果找到了就直接使用,如果未找到高镐,就去原型中找
2.使用對(duì)象設(shè)置屬性的時(shí)候溉旋,只會(huì)在對(duì)象的本身進(jìn)行查找,不會(huì)去原型中查找避消,如果對(duì)象本身中沒有這個(gè)屬性低滩,則給該對(duì)象新增一個(gè)屬性
如果對(duì)象中有這個(gè)屬性,修改這個(gè)屬性岩喷。
3.如果在原型對(duì)象中有引用類型的屬性,那么使用對(duì)象進(jìn)行修改該屬性內(nèi)容监憎,則其他所有跟這個(gè)原型對(duì)象相關(guān)的對(duì)象都會(huì)受到影響纱意,
Person.prototype.car = {}
var p = new Person();
p.car = {}; //這是修改屬性。
p.car.brand = '' //這是修改屬性的內(nèi)容
let a = p.car //查找鲸阔,如果自身對(duì)象沒有則在原型對(duì)象中查找偷霉,然后a.brand
4.一般情況下不會(huì)將屬性添加到原型對(duì)象中
只會(huì)講需要共享的方法添加到原型對(duì)象中
8、__proto__
1褐筛、這個(gè)屬性不是標(biāo)準(zhǔn)屬性类少,所以存在通用性問題。
2.一般不推薦使用
3.調(diào)試的時(shí)候可以使用
4.這個(gè)屬性是原型中的屬性渔扎。
9硫狞、替換原型的時(shí)候注意事項(xiàng)
在新替換的原型中,沒有constructor屬性晃痴,會(huì)影響三角結(jié)構(gòu)關(guān)系的合理性残吩。
so,在新替換的原型中倘核,手動(dòng)添加constructor屬性泣侮,以保證合理性,賦值為關(guān)聯(lián)的構(gòu)造函數(shù)紧唱。
Person.prototype = {
constructor: Person
}