淺談JS中的面向?qū)ο?/h3>
本文主要說說本人在JS中對面向?qū)ο蟮睦斫狻?/p>
計(jì)算機(jī)編程語言主要分為面向過程式編程和面向?qū)ο笫骄幊唐窠颍嫦驅(qū)ο缶幊套畲蟮奶攸c(diǎn)就是類盖袭,比如人有姓名怠晴,性別蛋褥,年齡临燃,行為等,電腦有型號烙心,重量等膜廊,類就是將一類事物的共通點(diǎn)放到一個集合中。
JS中本身沒有class(ES6以前淫茵,ES6引入了class爪瓜,本文主要針對ES6以前進(jìn)行講解),但是有類class的概念匙瘪,就是我們常說的構(gòu)造函數(shù)铆铆,本質(zhì)上是構(gòu)造函數(shù)中的prototype起到類似class的作用。
1丹喻、首先我們來看看怎么構(gòu)建一個對象薄货。
var person = new Object();
//給person屬性
person.name = "Lily";
person.age = 17;
//給person創(chuàng)建一個走路的方法
person.walk = function () {
? alert(this.name + "正在走路");
};
//調(diào)用person對象
person.walk(); //Lily正在走路
但是這種創(chuàng)建方式有一個很大的缺點(diǎn),就是如果有多個類似的對象碍论,會產(chǎn)生大量重復(fù)性代碼菲驴,怎么解決呢?后來有人創(chuàng)造了工廠模式骑冗。
2赊瞬、工廠模式
function person (name, age) {
? var obj = new Object();
? obj.name = name;
? obj.age = age;
? obj.walk = function () {
? ? alert(this.name + "正在走路");
? };
? obj.eat = function () {
? ? alert(this.name + "正在吃飯");
? };
? return obj;
}
// 調(diào)用
person('Lily', 17).walk(); //Lily正在走路
person('Bob', 15).eat(); //Bob正在吃飯
工廠模式有效的解決了代碼冗余的問題,但是又產(chǎn)生了一個新的問題贼涩,就拿該實(shí)例來說巧涧,Bob吃飯時間在8點(diǎn),但是Lily這個點(diǎn)正在走路遥倦,那么注定了有一個方法是多余的谤绳,這還是一個簡單的實(shí)例,如果是一個復(fù)雜的對象袒哥,有十幾個方法缩筛,但是實(shí)際用到的只有其中的一個方法,這就浪費(fèi)內(nèi)存資源了堡称,因?yàn)槊總€對象在實(shí)例化的時候都會創(chuàng)建工廠中的屬性和方法瞎抛。解決方法我們第四點(diǎn)來講,我們先講講構(gòu)建函數(shù)的模式來構(gòu)建對象却紧。
3桐臊、構(gòu)建函數(shù)模式
function Person (name, age) {
? this.name = name;
? this.age = age;
? this.walk = function () {
? ? alert(this.name + "正在走路");
? };
? this.eat = function () {
? ? alert(this.name + "正在吃飯");
? };
}
//調(diào)用方式
var boy = new Person("Bob", 15);
var girl = new Person("Lily", 17);
boy.walk(); //Bob正在走路
girl.eat(); //Bob正在吃飯
這種模式與工廠模式相比胎撤,有幾個明顯的特點(diǎn)
1、不顯式的創(chuàng)建對象(即不new Object())断凶,而是通過this伤提,this在這里表示調(diào)用者。
2认烁、不用return返回
3肿男、使用new的方式調(diào)用。
缺點(diǎn):還是沒有解決工廠模式存在的內(nèi)存浪費(fèi)問題却嗡。
有人會說構(gòu)建函數(shù)模式和普通函數(shù)有什么區(qū)別呢舶沛?
構(gòu)建函數(shù)模式就是用函數(shù)的方式來體現(xiàn)對象,最大的區(qū)別就是調(diào)用方式稽穆,構(gòu)建函數(shù)的調(diào)用方式是用new來實(shí)例化(new Person())冠王,而普通函數(shù)就是直接調(diào)用函數(shù)名(person())赶撰。
4舌镶、原型模式
function Person (name, age) {
? Person.prototype.name = name;
? Person.prototype.age = age;
? Person.prototype.talk = function () {
? ? alert(this.name + "正在說話");
? }
}
Person.prototype.walk = function () {
? alert(this.name + "正在走路");
}
// 調(diào)用
var boy = new Person("Bob", 15);
boy.walk();//Bob正在走路
原型模式我比較喜歡稱之為(混合模式),該模式有效的解決了內(nèi)存浪費(fèi)問題豪娜,將通用的方法或?qū)傩苑诺絇erson中餐胀,將實(shí)例的特別屬性單獨(dú)定義。