第6章 對象模式

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

JavaScipt 對象的所有屬性都是公有的,沒有顯式的方法指定某個屬性不能被外界訪問。

6.1.1 模塊模式

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

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

模塊模式還有一個變種叫暴露模塊模式,它將所有的變量和方法都放在 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òu)造函數(shù)中使用類似的模式來創(chuàng)建每個實例的私有數(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

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

如果你需要所有實例共享私有數(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 混入

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

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

這是淺拷貝,如果屬性的值是一個引用,那么兩者將指向同一個對象。

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

構(gòu)造函數(shù)也是函數(shù),所以不用 new 也能調(diào)用它們來改變 this 的值。在非嚴(yán)格模式下, this 被強制指向全局對象。而在嚴(yán)格模式下,構(gòu)造函數(shù)會拋出一個錯誤(因為嚴(yán)格模式下沒有為全局對象設(shè)置 thisthis 保持為 undefined)。
而很多內(nèi)建構(gòu)造函數(shù),例如 ArrayRegExp 不需要 new 也能正常工作,這是因為它們被設(shè)計為作用域安全的構(gòu)造函數(shù)。
當(dāng)用 new 調(diào)用一個函數(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)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,622評論 6 544
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 99,716評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,746評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經(jīng)常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,991評論 1 318
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 72,706評論 6 413
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 56,036評論 1 329
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 44,029評論 3 450
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 43,203評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 49,725評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 41,451評論 3 361
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,677評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,161評論 5 365
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,857評論 3 351
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,266評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,606評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,407評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 48,643評論 2 380

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

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