首先吨艇,我們一起來回想一下JS中創(chuàng)建對象的方法都有哪些。
方法一共有三種:
? ? ? ? 1、利用內(nèi)置對象?
? ? ? ? ? ? ? 例:var oB=new object();
? ? ? ? 2画切、利用JSON
? ? ? ? ? ? ? 例:var?person={
? ? ? ? ? ? ? ? ? ? ? ? ? ?name :"某某某",
? ? ? ? ? ? ? ? ? ? ? ? ? ?age :18,
? ? ? ? ? ? ? ? ? ? ? ? ? ?say :function() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?alert("我的名字是:"+this.name+",我今年"+this.age+"歲了");
? ? ? ? ? ? ? ? ? ? ? ? ? ? }
? ? ? ? ? ? ? ? ? ? };
? ? ? ? ? ? ? ? ? ?person.say();
? ? ? ? 3、自定義對象構(gòu)造
? ? ? ? ? ? ? 例:
? ? ? ? ? ? ? ? ? ?function?createOb (name,age) {
? ? ? ? ? ? ? ? ? ? ? ? ? varo= newObject();
? ? ? ? ? ? ? ? ? ? ? ? ? o.name=name;
? ? ? ? ? ? ? ? ? ? ? ? ? o.age=age;
? ? ? ? ? ? ? ? ? ? ? ? ? o.say=function() {
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? alert("我的名字是:"+this.name+",我今年"+this.age+"歲了");
? ? ? ? ? ? ? ? ? ? ? ? ? ?}
? ? ? ? ? ? ? ? ? ? ? ? ? ?returno;
? ? ? ? ? ? ? ? ?}
//基于工廠模式的定義方式定義對象
//在一個方法中定義一個對象囱怕,將傳遞進(jìn)來的
//屬性賦給了這個對象
? ? ? ? ? ? ? ? ? ? ? ? var?p1= createOb ("劉建宏",18);
? ? ? ? ? ? ? ? ? ? ? ? p1.say();
? ? ? ? ? ? ? ? ? ? ? ? var?p2= createOb ("牟文斌",20);
? ? ? ? ? ? ? ? ? ? ? ? p2.say();
那什么是面向?qū)ο?我們先來說一下什么是面向過程霍弹。
面向過程就是:
自頂向下順序執(zhí)行,逐步求精娃弓;其程序結(jié)構(gòu)是按功能劃分為若干個基本模塊典格,這些模塊形成一個樹狀結(jié)構(gòu);各模塊之間的關(guān)系盡可能簡單忘闻,在功能上相對獨(dú)立钝计;每一模塊內(nèi)部均是由順序、選擇和循環(huán)三種基本結(jié)構(gòu)組成齐佳;其模塊化實(shí)現(xiàn)的具體方法是使用子程序私恬。程序流程在寫程序時就已決定。
面向?qū)ο缶褪牵?br>
把數(shù)據(jù)及對數(shù)據(jù)的操作方法放在一起炼吴,作為一個相互依存的整體——對象本鸣。對同類對象抽象出其共性,形成類硅蹦。類中的大多數(shù)數(shù)據(jù)荣德,只能用本類的方法進(jìn)行處理。類通過一個簡單的外部接口與外界發(fā)生關(guān)系童芹,對象與對象之間通過消息進(jìn)行通信涮瞻。程序流程由用戶在使用中決定。
面向?qū)ο笾杏袃蓚€重要的概念:類和對象假褪。
類是某一具有共同特征的事物的總稱署咽,而對象是一類事物中具體的實(shí)例。
封裝---JAVASCRIPT的原型(prototype)
原型是js中非常特殊一個對象,當(dāng)一個函數(shù)創(chuàng)建之后宁否,會隨之就產(chǎn)生一個原型對象窒升,當(dāng)
通過這個函數(shù)的構(gòu)造函數(shù)創(chuàng)建了一個具體的對象之后,在這個具體的對象中就會有一個屬性
指向原型慕匠。
常見的原型檢測方式
可以通過如下的方式檢測p1是不是指向Person的原型對象
alert(Person.prototype.isPrototypeOf(p1))
//檢測p1的構(gòu)造器是否指向Person對象
alert(p1.constructor == Person)
//檢測某個屬性是不是自己內(nèi)存中的
alert(p1.hasOwnProperty("name"));
alert(p2.hasOwnProperty("name"))
檢測在某個對象自己或者對應(yīng)的原型中是否存在某個屬性饱须。
alert("name"inp1);//true
deletep2.name;//雖然刪除了自己的name屬性,但是原型中有
alert("name"inp2);//true
//原型和自己中都沒有sex屬性
alert("sex"inp1);//false
原型重寫
function?Person(){
}
Person.prototype={
name :"某某某",
age :18,
say :function() {
alert("我的名字是:"+this.name+",我今年"+this.age+"歲了");
}
}
varp1= newPerson();
p1.say()
varp2= newPerson();
p2.name="張三";
p2.age=20;
p2.say();
但是這種寫法台谊,我們是將該對象的原型覆蓋蓉媳。并且會產(chǎn)生問題。
此時p1的構(gòu)造器不在指向Person青伤,而是指向了Object督怜。因?yàn)槲覀兏采w了Person的原型,所以如果constructor比較重要的話狠角,我們可以手動指向号杠。在重寫中添加constructor:Person。