Java的面向?qū)ο缶幊?/a>">Java的面向?qū)ο缶幊?/a>
671
2025-04-03
javaScript屬于動(dòng)態(tài)類型語言,所謂動(dòng)態(tài)類型語言,就是只變量在運(yùn)行使用到的時(shí)候,才會(huì)具有某種類型的語言。
面向?qū)ο蟮娜齻€(gè)基本特征:封裝、繼承、多態(tài)。下面我們來了解一下這三個(gè)特征。
封裝:封裝的目的是隱藏信息,即不暴露函數(shù)中的屬性和方法,讓外界不能操作,但可以暴露接口給外界,外界只能通過暴露的接口來進(jìn)行相關(guān)操作。下面這個(gè)栗子中,我們將會(huì)將變量封裝到函數(shù)中,并對(duì)外暴露一個(gè)方法,以便于訪問,不過這個(gè)栗子,我會(huì)用多種方式來實(shí)現(xiàn),同樣達(dá)到封裝的目的,但是特性是不通的哦~
//原始方法 var myObj = (function() { var a = "a"; return { getA: function() { return a; } } })(); console.log(myObj.getA()); //a console.log(myObj.a); //undefined function A() { var b = 'b'; this.getB = function() { return b; } }; var B = new A(); console.log(B.getB()); //b console.log(B.b); //undefined //對(duì)于有同樣功能的函數(shù),如果使用原始方法,需要多次創(chuàng)建,不利于代碼的復(fù)用。
//工廠加工方法 function creatObj(name) { var name1 = "name1"; var obj = new Object(); obj.getName1 = function() { return name1; }; obj.name2 = name; obj.getName2 = function() { return this.name2; }; return obj; }; var C = creatObj("jiangtengteng"); console.log(C.getName1()); //name1 console.log(C.name1); //undefined console.log(C.getName2()); //jiangtengteng console.log(C.name2); //jiangtengteng //工廠加工方法,可以復(fù)用功能了,但是這其實(shí)是對(duì)函數(shù)的引用,思想上和面向?qū)ο箢惖乃枷氩环?/p>
//構(gòu)造函數(shù)方法 function creatObj(name) { var name1 = "name1"; this.getName1 = function() { return name1; }; this.name2 = name; this.getName2 = function() { return this.name2; }; }; var C = new creatObj("jiangtengteng"); console.log(C.getName1()); //name1 console.log(C.name1); //undefined console.log(C.getName2()); //jiangtengteng console.log(C.name2); //ujiangtengteng //此方法特性同工廠加工方法一致
//原型方法 function creatObj(){}; creatObj.prototype.name = "Jhon"; creatObj.prototype.array = ["11","22"]; creatObj.prototype.getName = function(){ return this.name; }; creatObj.prototype.conArray = function(){ return this.array; }; var D = new creatObj(); var E = new creatObj(); console.log(D.getName()); console.log(D.conArray()); D.array.push('33'); console.log(D.conArray()); console.log(E.conArray()); //此方法實(shí)例化的函數(shù)由于引用的是同一個(gè)對(duì)象,任何一個(gè)函數(shù)對(duì)對(duì)象做了修改,那其他實(shí)例化的函數(shù)也同樣會(huì)收到影響
//構(gòu)造函數(shù)+原型方法 function creatObj(name, age){ this.name = name; this.age = age; }; creatObj.prototype.getName = function(){ return this.name; }; creatObj.prototype.getAge = function(){ return this.age; }; var F = new creatObj("me","11"); console.log(F.getName()); console.log(F.getAge()); //屬性私有后,改變各自的屬性不會(huì)影響別的對(duì)象。同時(shí),方法也是由各個(gè)對(duì)象共享的。在語義上,這符合了面向?qū)ο缶幊?/a>的要求。
從上面的例子里,我們可以看出,封裝完成后,封裝的內(nèi)容可以是公開的,也可以是私有的,使用原型創(chuàng)建的方法是共享的,而函數(shù)里聲明的變量則是私有的,如果我們希望某個(gè)屬性或者方法可以共用,則最好使用原型方法添加函數(shù)。
繼承:主要是指屬性的繼承和方法的繼承。我們可以將需要復(fù)用的方法和屬性,定義在父類中,而子類在需要使用到相關(guān)的方法和屬性時(shí),直接從父類繼承即可。
//通過對(duì)象冒充來實(shí)現(xiàn)繼承 //顧客信息 function Customer(name, phone) { this.name = name; this.phone = phone; this.show = function() { alert(this.name + ":" + this.phone); } }; //普通顧客折扣 function NormalCustomer(name, phone, price) { this.norCos = Customer; this.norCos(name, phone); this.price = price; this.discount = function() { alert("普通顧客:" + this.name + ",你打完9折的價(jià)格為:" + this.price * 0.9); } }; var jhon = new NormalCustomer("Jhon", "", "100"); jhon.discount(); //vip顧客折扣 function VipCustomer(name, phone) { this.vipCos = Customer; this.vipCos(name, phone); this.discount = function(price) { alert("VIP顧客:" + this.name + ",你打完6折的價(jià)格為:" + price * 0.6); } }; var lucy = new VipCustomer("Lucy", ""); lucy.discount("100");
上面的示例是通過冒充對(duì)象來實(shí)現(xiàn)繼承的,下面我們使用call或者apply來實(shí)現(xiàn)繼承:
//通過call或者apply實(shí)現(xiàn)繼承 //顧客信息 function Customer(name, phone) { this.name = name; this.phone = phone; this.show = function() { alert(this.name + ":" + this.phone); } }; //普通顧客折扣 call function NormalCustomer(name, phone) { Customer.call(this, name, phone); //如果用apply實(shí)現(xiàn),則可以 //Customer.apply(this,[name, phone]); //說明傳入的參數(shù)是 數(shù)組方式 this.discount = function(price) { alert("普通顧客:" + this.name + ",你打完8折的價(jià)格為:" + price * 0.8); }; }; var jhon = new NormalCustomer("Jhon", ""); jhon.discount("100"); //vip顧客折扣 apply function VipCustomer(name, phone) { //如果用call實(shí)現(xiàn),則可以 // Customer.call(this, name, phone); Customer.apply(this,[name, phone]); //說明傳入的參數(shù)是 數(shù)組方式 this.discount = function(price) { alert("普通顧客:" + this.name + ",你打完5折的價(jià)格為:" + price * 0.5); }; }; var lucy = new VipCustomer("Lucy", ""); lucy.discount("100");
多態(tài):即同一操作作用于不同的對(duì)象上面,可以產(chǎn)生不同的解釋和不同的執(zhí)行結(jié)果。比如說,朋友家養(yǎng)了一條狗和一只貓,當(dāng)我朋友喂小動(dòng)物們時(shí),狗要吃骨頭,而貓要吃魚~。多態(tài)的宗旨是把不變的部分隔離開,把可變的部分封裝起來,就是著名的開發(fā)-封閉原則啦~,來段代碼理解下~
//聲明主人 主人有名字以及行為 function Master(name) { this.name = name; }; //給主人添加喂養(yǎng)動(dòng)物的行為 Master.prototype.feed = function(animal, food) { alert(animal.name + "要吃" + food.name); }; //食物 function Food(name) { this.name = name; }; //動(dòng)物 function Animal(name) { this.name = name; }; var cat = new Animal("貓"); var fish = new Food("魚"); var dog = new Animal("狗"); var bone = new Animal("骨頭"); var master = new Master("Kate"); master.feed(cat, fish); master.feed(dog, bone);
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。
版權(quán)聲明:本文內(nèi)容由網(wǎng)絡(luò)用戶投稿,版權(quán)歸原作者所有,本站不擁有其著作權(quán),亦不承擔(dān)相應(yīng)法律責(zé)任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實(shí)的內(nèi)容,請(qǐng)聯(lián)系我們jiasou666@gmail.com 處理,核實(shí)后本網(wǎng)站將在24小時(shí)內(nèi)刪除侵權(quán)內(nèi)容。