第6章 對象模式

6.1 私有成員和特權(quán)成員

JavaScipt 對象的所有屬性都是公有的玄括,沒有顯式的方法指定某個(gè)屬性不能被外界訪問僧著。

6.1.1 模塊模式

模塊模式是一種用于創(chuàng)建擁有私有數(shù)據(jù)的單件對象的模式锥惋。
基本做法是使用立即調(diào)用函數(shù)表達(dá)式(IIFE)來返回一個(gè)對象屋群。原理是利用閉包。

var yourObj = (function(){
    // private data variables
    
    return {
        // public methods and properties
    }
}());

模塊模式還有一個(gè)變種叫暴露模塊模式您宪,它將所有的變量和方法都放在 IIFE 的頭部奈懒,然后將它們設(shè)置到需要被返回的對象上。

//  一般寫法
var yourObj = (function(){
    var age = 25;
    
    return {
        name: "Ljc",
        
        getAge: function(){
            return agel
        }
    }
}());

// 暴露模塊模式
var yourObj = (function(){
    var age = 25;
    function getAge(){
        return agel
    };
    return {
        name: "Ljc",
        getAge: getAge
    }
}());

6.1.2 構(gòu)造函數(shù)的私有成員(不能通過對象直接訪問)

模塊模式在定義單個(gè)對象的私有屬性十分有效宪巨,但對于那些同樣需要私有屬性的自定義類型呢磷杏?你可以在構(gòu)造函數(shù)中使用類似的模式來創(chuàng)建每個(gè)實(shí)例的私有數(shù)據(jù)。

function Person(name){
    // define a variable only accessible inside of the Person constructor
    var age = 22;
    
    this.name = name;
    this.getAge = function(){
        return age;
    };
    this.growOlder = function(){
        age++;
    }
}

var person = new Person("Ljc");

console.log(person.age); // undefined
person.age = 100;
console.log(person.getAge()); // 22

person.growOlder();
console.log(person.getAge()); // 23

這里有個(gè)問題:如果你需要對象實(shí)例擁有私有數(shù)據(jù)揖铜,就不能將相應(yīng)方法放在 prototype 上茴丰。

如果你需要所有實(shí)例共享私有數(shù)據(jù)。則可結(jié)合模塊模式和構(gòu)造函數(shù)天吓,如下:

var Person = (function(){
    var age = 22;

    function InnerPerson(name){
        this.name = name;
    }

    InnerPerson.prototype.getAge = function(){
        return age;
    }
    InnerPerson.prototype.growOlder = function(){
        age++;
    };

    return InnerPerson;
}());

var person1 = new Person("Nicholash");
var person2 = new Person("Greg");

console.log(person1.name); // "Nicholash"
console.log(person1.getAge()); // 22

console.log(person2.name); // "Greg"
console.log(person2.getAge()); // 22

person1.growOlder();
console.log(person1.getAge()); // 23
console.log(person2.getAge()); // 23

6.2 混入

這是一種偽繼承贿肩。一個(gè)對象在不改變原型對象鏈的情況下得到了另外一個(gè)對象的屬性被稱為“混入”。因此龄寞,和繼承不同汰规,混入讓你在創(chuàng)建對象后無法檢查屬性來源。
純函數(shù)實(shí)現(xiàn):

function mixin(receiver, supplier){
    for(var property in supplier){
        if(supplier.hasOwnProperty(property)){
            receiver[property] = supplier[property];
        }
    }
}

這是淺拷貝物邑,如果屬性的值是一個(gè)引用溜哮,那么兩者將指向同一個(gè)對象滔金。

6.3 作用域安全的構(gòu)造函數(shù)

構(gòu)造函數(shù)也是函數(shù),所以不用 new 也能調(diào)用它們來改變 this 的值茂嗓。在非嚴(yán)格模式下餐茵, this 被強(qiáng)制指向全局對象。而在嚴(yán)格模式下述吸,構(gòu)造函數(shù)會拋出一個(gè)錯(cuò)誤(因?yàn)閲?yán)格模式下沒有為全局對象設(shè)置 this忿族,this 保持為 undefined)。
而很多內(nèi)建構(gòu)造函數(shù)蝌矛,例如 Array道批、RegExp 不需要 new 也能正常工作,這是因?yàn)樗鼈儽辉O(shè)計(jì)為作用域安全的構(gòu)造函數(shù)入撒。
當(dāng)用 new 調(diào)用一個(gè)函數(shù)時(shí)隆豹,this 指向的新創(chuàng)建的對象是屬于該構(gòu)造函數(shù)所代表的自定義類型。因此茅逮,可在函數(shù)內(nèi)用 instanceof 檢查自己是否被 new 調(diào)用璃赡。

function Person(name){
    if(this instanceof Person){
        // called with "new"
    }else{
        // called without "new"
    }
}

具體案例:

function Person(name){
    if(this instanceof Person){
        this.name = name;
    }else{
        return new Person(name);
    }
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市氮唯,隨后出現(xiàn)的幾起案子鉴吹,更是在濱河造成了極大的恐慌姨伟,老刑警劉巖惩琉,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夺荒,居然都是意外死亡瞒渠,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門技扼,熙熙樓的掌柜王于貴愁眉苦臉地迎上來伍玖,“玉大人,你說我怎么就攤上這事剿吻∏瞎浚” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵丽旅,是天一觀的道長椰棘。 經(jīng)常有香客問我,道長榄笙,這世上最難降的妖魔是什么邪狞? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮茅撞,結(jié)果婚禮上帆卓,老公的妹妹穿的比我還像新娘巨朦。我一直安慰自己,他們只是感情好剑令,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布糊啡。 她就那樣靜靜地躺著,像睡著了一般吁津。 火紅的嫁衣襯著肌膚如雪悔橄。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天腺毫,我揣著相機(jī)與錄音癣疟,去河邊找鬼。 笑死潮酒,一個(gè)胖子當(dāng)著我的面吹牛睛挚,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播急黎,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扎狱,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了勃教?” 一聲冷哼從身側(cè)響起淤击,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎故源,沒想到半個(gè)月后污抬,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡绳军,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年印机,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片门驾。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡射赛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出奶是,到底是詐尸還是另有隱情楣责,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布聂沙,位于F島的核電站秆麸,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏逐纬。R本人自食惡果不足惜蛔屹,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望豁生。 院中可真熱鬧兔毒,春花似錦漫贞、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至豪嗽,卻和暖如春谴蔑,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背龟梦。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工隐锭, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人计贰。 一個(gè)月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓钦睡,卻偏偏與公主長得像,于是被迫代替她去往敵國和親躁倒。 傳聞我的和親對象是個(gè)殘疾皇子荞怒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容

  • 工廠模式類似于現(xiàn)實(shí)生活中的工廠可以產(chǎn)生大量相似的商品,去做同樣的事情秧秉,實(shí)現(xiàn)同樣的效果;這時(shí)候需要使用工廠模式褐桌。簡單...
    舟漁行舟閱讀 7,766評論 2 17
  • 今天,杜娟老師的開場白異常溫暖象迎。 如果群里有正在遭受這樣創(chuàng)傷的親荧嵌,如果你還沒有攢足能量說出你的經(jīng)歷或者回憶你的經(jīng)歷...
    helenxxf閱讀 241評論 0 0
  • 連續(xù)幾天的大霧天氣,終于告一段落挖帘。亦如她如墜霧靄的心緒完丽。 其實(shí)恋技,在他說出:對不起忘了我吧拇舀,那句話時(shí),他倆或許已經(jīng)結(jié)...
    云端兒閱讀 190評論 0 1
  • 鎮(zhèn)子里起了很多高樓蜻底,算是響應(yīng)了國家的城鎮(zhèn)化建設(shè)(冗余)骄崩。高樓很多,卻也空著薄辅。 許多的人進(jìn)城了要拂,許多的老頭老太太找塊...
    實(shí)在想不出昵稱丶閱讀 233評論 0 0