1焦履、面向?qū)ο缶幊蹋∣OP)的特點:
抽象:抓住核心問題
封裝:只能通過對象來訪問方法
繼承:從已有的對象下繼承出新的對象
多態(tài):多對象的不同形態(tài)
一配乓、創(chuàng)建對象的幾種方式
javascript 創(chuàng)建對象簡單的來說,無非就是使用內(nèi)置對象或各種自定義對象巢株,當(dāng)然還可以使用JSON槐瑞,但寫法有很多,也能混合使用阁苞。
1随珠、工廠方式創(chuàng)建對象:面向?qū)ο笾械姆庋b函數(shù)(內(nèi)置對象)
functioncreatePerson(name){
? ? ? ? //1灭袁、原料
? ? ? ? var obj=new Object();
? ? ? ?//2、加工
? ? ? ?obj.name=name;
? ? ? ?obj.showName=function(){
? ? ? ? ? ? ? ? ?alert(this.name);
? ? ? ?}
? ? ? ? //3窗看、出場茸歧、
? ? ? ?return obj;
?}
var p1=createPerson('小米');
p1.showName()
與系統(tǒng)對象的區(qū)別:
var arr=new Array();//生成一個系統(tǒng)數(shù)組對象
1、系統(tǒng)對象是直接用 new 在外面生成显沈,而工廠定義的是在函數(shù)內(nèi)部生成
2软瞎、工廠定義的函數(shù)名稱第一個是小寫開頭,而系統(tǒng)定義的是大寫開頭
工廠模式的優(yōu)缺點:雖然解決了創(chuàng)建相似對象的問題拉讯,但是卻沒有解決對象識別問題(即怎樣知道一個對象的類型)涤浇。
2、構(gòu)造函數(shù)創(chuàng)建對象
當(dāng)new去調(diào)用一個函數(shù)魔慷,這個時候函數(shù)中的this就是創(chuàng)建出來的對象只锭,而且函數(shù)的返回值就是this(隱式返回)
new后面的函數(shù)叫做構(gòu)造函數(shù)
<1>有參數(shù)的構(gòu)造函數(shù)
function CreatePerson(name){
? ? ? ? ? this.name=name;
? ? ? ? ? this.showName=function(){
? ? ? ? ? ? ? ? ? alert(this.name);
? ? ? ? ? }
}var p1=newCreatePerson('小米');
<2>無參數(shù)的構(gòu)造函數(shù)
function CreatePerson(){}
? ? ? ?var? ? p1=new? CreatePerson();
? ? ? ?p1.name="小米";
? ? ? ?p1.showName=function(){
? ? ? ? ? ? ? ?alert(p1.name);
? ? ? ?}
? ? ? ?p1.showName();
構(gòu)造函數(shù)模式的優(yōu)缺點:
? ? ? ?1、優(yōu)點:創(chuàng)建自定義函數(shù)意味著將來可以將它的實例標(biāo)識為一種特定的類型院尔,這是構(gòu)造函數(shù)? ? ? ? ? ? 勝過工廠模式的地方
? ? ? ?2蜻展、缺點:每個方法都要在每個實例上重新創(chuàng)建一遍
3、對象字面量方式創(chuàng)建對象
person={
? ? name:"小米",
? ? age:23
};
4邀摆、用原型方式
? ? ? ?1纵顾、原型對象:只要創(chuàng)建了一個新函數(shù),就會為該函數(shù)創(chuàng)建一個prototype屬性栋盹,這個屬性指向? ? ? ? ? ? ? ?函數(shù)的原型對象施逾。在默認(rèn)情況下,所有的原型對象都會自動獲得一個constructor(構(gòu)造函? ? ? ? ? ? ? ?數(shù))屬性例获,這個屬性是一個指向prototype屬性所在函數(shù)的指針
? ? ? ?2汉额、可以通過isPrototypeOf()方法來確定對象之間是否存在這種關(guān)系
function Person(){}
? ? ? Person.prototype.name="小米";
? ? ? Person.prototype.showName=function(){
? ? ? ? ? ? ? alert(this.name);
? ? ? }
? ? ? var p1=newPerson();
? ? ? p1.showName();
原型模式的優(yōu)缺點:
? ? ? ? 1、優(yōu)點:可以讓所有的對象實例共享它所包含的屬性和方法
? ? ? ? 2榨汤、缺點:原型中是所有屬性都是共享的蠕搜,但是實例一般都是要有自己的單獨屬性的。所以一? ? ? ? ? ? ? ? ? 般很少單獨使用原型模式件余。
5.混合模型
構(gòu)造函數(shù)模式定義實例屬性讥脐,而原型模式用于定義方法和共享的屬性
function? CreatePerson(name){
? ? ? ?this.name=name;
}
Create.prototype.showName=function(){
? ? ? ? alert(this.name);
}
var? p1=new? CreatePerson('小米');? ??
p1.showName();
var p2=new CreatePerson('小米');
p2.showName();
alert(p1.showName==p2.showName);
//true;原因:都是在原型下面,在內(nèi)存中只存在一份啼器,地址相同
總結(jié):
function 構(gòu)造函數(shù)(){
this.屬性;
}
構(gòu)造函數(shù).原型.方法=function(){};
var 對象1=new 構(gòu)造函數(shù)();
對象1.方法();