javascript-創(chuàng)建對象

Javascript高級程序設(shè)計(第2版) 6.1創(chuàng)建對象 閱讀整理

  1. 最簡單方式,創(chuàng)建一個object的實例堕虹,然后添加屬性方法

    var person = new Object();
    person.name = "rk-coder";
    person.age = 26;
    
    person.sayName = function (){
        console.log(this.name);
    };
    
    person.sayName();
    

    缺點:創(chuàng)建大量對象掉伏,產(chǎn)生大量的重復(fù)代碼君丁。

  2. 工廠模式

    function createPerson(name, age){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.sayName = function (){
            console.log(this.name);
        };
        return o;
    }
    
    var person1 = createPerson("rk-coder", 26);
    var person2 = createPerson("rk-coder2", 27);
    
    person1.sayName();//rk-coder
    person2.sayName();//rk-coder2
    

    缺點:無法識別對象及對象類型

  3. 構(gòu)造函數(shù)模式
    ECMAScript中的構(gòu)造函數(shù)可以用來創(chuàng)建特定類型的對象筷凤。構(gòu)造函數(shù)不同于其他函數(shù)痴怨,為了區(qū)別按照慣例,構(gòu)造函數(shù)的函數(shù)名首字母大寫上祈,另外通過構(gòu)造函數(shù)創(chuàng)建實例喊崖,必須使用new操作符。

    function Person(name, age){
        this.name = name;
        this.age = age;
        
        this.sayName = function (){
            console.log(this.name);
        };
    }
    
    var person1 = new Person("rk-coder", 26);
    var person2 = new Person("rk-coder2", 27);
    
    person1.sayName();
    person2.sayName();
    

    這里person1person2兩對象都有一個constructor(構(gòu)造函數(shù))屬性雇逞,該屬性指向Personconstructor屬性最初是用來標識對象類型的茁裙,但要檢測對象類型塘砸,最好還是使用instanceof操作符。

    console.log(person1.constructor == Person);//true
    console.log(person2.constructor == Person);//true
    console.log(person1 instanceof Object);//true
    console.log(person2 instanceof Object);//true
    console.log(person1 instanceof Person);//true
    console.log(person2 instanceof Person);//true
    

    構(gòu)造函數(shù)和其他函數(shù)區(qū)別在于調(diào)用的方式不同晤锥。構(gòu)造函數(shù)本身也是函數(shù)掉蔬,不通過new調(diào)用廊宪,跟普通函數(shù)沒有區(qū)別, 而普通函數(shù)也可以通過new調(diào)用作為構(gòu)造函數(shù)。
    缺點: 每個方法都要在實例上重新創(chuàng)建一遍女轿。

  4. 原型模式

    function Person(){};
    
    Person.prototype.name = 'rk-coder';
    Person.prototype.age = 26;
    Person.prototype.sayName = function (){
        console.log(this.name);
    };
    
    var person = new Person("rk-coder", 26);
    person.sayName();
    

    每個創(chuàng)建的函數(shù)都有一個prototype(原型)屬性箭启。這個屬性指向一個對象,包含可以由特定類型的所有實例共享的屬性和方法蛉迹。就是通過調(diào)用構(gòu)造函數(shù)而創(chuàng)建的那個對象實例的原型對象傅寡。使用原型對象可以讓所有對象的實例共享它所包含的屬性和方法。
    默認情況下北救,所有原型對象都會自動獲得一個constructor屬性荐操,包含一個指向prototype屬性所在函數(shù)的指針。

    當(dāng)調(diào)用構(gòu)造函數(shù)創(chuàng)建一個新實例后珍策,該實例內(nèi)部將包含一個指向構(gòu)造函數(shù)的原型對象的指針(__proto__)托启。

    每當(dāng)代碼讀取某對象的某屬性時,都會首先從當(dāng)前這個對象的實例本身搜索攘宙,有則返回屯耸,沒有則會繼續(xù)指向到原型對象,在原型對象中搜索查找蹭劈。因此可以在實例上定義設(shè)置一些屬性和方法疗绣,對原型對象沒有影響,如果定義了與原型對象相同的屬性名或方法名链方,則將屏蔽原型上的值(如果需要回復(fù)持痰,則需要使用delete刪除實例上的值)。另外對原型對象所做的修改都將立即從實例上反映出來祟蚀,即便是修改前創(chuàng)建的實例工窍。

    • isPrototypeOf: 判斷其原型對象是否存在于指定的對象實例中。
    • hasOwnProperty: 判斷檢測指定屬性是否存在于實例中前酿,無法判斷是否在原型中存在患雏。
    • in: 指定屬性是否通過對象可以訪問到,無論存在于實例還是原型罢维。
      缺點: 原型中所有屬性都是共享的淹仑,顯然在某種程度上會帶來一些不方便,實例需要一些自己的屬性肺孵。
  5. 組合使用構(gòu)造函數(shù)模式和原型模式
    使用構(gòu)造函數(shù)模式定義實例屬性匀借,原型模式定義方法和共享的屬性。這種是目前在ECMAScript中使用最廣泛平窘、認同度最高的一種創(chuàng)建自定義類型的方法吓肋。

    function Person(name, age){
        this.name = name;
        this.age = age;
    }
    Person.prototype = {
        constructor: Person,
        sayName: function (){
            console.log(this.name);
        }
    };
    
    var person = new Person("rk-coder", 26);
    person.sayName();
    
  6. 動態(tài)原型模式

    function Person(name, age){
        this.name = name;
        this.age = age;
        
        if(typeof this.sayName != 'function'){
            Person.prototype.sayName = function (){
                console.log(this.name);
            };
            //... ...
        }
    }
    
    var person = new Person("rk-coder", 26);
    person.sayName();
    

    在初次調(diào)用構(gòu)造函數(shù)時,初始化原型對象瑰艘。

  7. 寄生構(gòu)造函數(shù)模式

    function Person(name, age){
        var o = new Object();
        o.name = name;
        o.age = age;
        o.sayName = function (){
            console.log(this.name);
        };
    }
    
    var person = new Person("rk-coder", 26);
    person.sayName();
    

    這種模式僅僅是封裝創(chuàng)建對象的代碼是鬼,然后再返回新創(chuàng)建的對象肤舞。通過return語句重寫調(diào)用構(gòu)造函數(shù)時返回的值。但返回的對象與構(gòu)造函數(shù)或者與構(gòu)造函數(shù)的原型屬性之間沒有關(guān)系均蜜,因此不能依賴instanceof操作符來確定對象類型李剖,不建議試用。

  8. 穩(wěn)妥構(gòu)造函數(shù)模式

    function Person(name, age){
        var o = new Object();
        o.sayName = function (){
            console.log(name);
        };
        
        return o;
    }
    
    var person = Person("rk-coder", 26);
    person.sayName();
    

    這種模式創(chuàng)建的對象囤耳,除了使用sayName()方法之外篙顺,沒有其他的方式訪問name的值。適合在某些安全執(zhí)行的環(huán)境下使用紫皇。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末慰安,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子聪铺,更是在濱河造成了極大的恐慌化焕,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,464評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件铃剔,死亡現(xiàn)場離奇詭異撒桨,居然都是意外死亡,警方通過查閱死者的電腦和手機键兜,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,033評論 3 399
  • 文/潘曉璐 我一進店門凤类,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人普气,你說我怎么就攤上這事谜疤。” “怎么了现诀?”我有些...
    開封第一講書人閱讀 169,078評論 0 362
  • 文/不壞的土叔 我叫張陵夷磕,是天一觀的道長。 經(jīng)常有香客問我仔沿,道長坐桩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,979評論 1 299
  • 正文 為了忘掉前任封锉,我火速辦了婚禮绵跷,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘成福。我一直安慰自己碾局,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,001評論 6 398
  • 文/花漫 我一把揭開白布奴艾。 她就那樣靜靜地躺著擦俐,像睡著了一般。 火紅的嫁衣襯著肌膚如雪握侧。 梳的紋絲不亂的頭發(fā)上蚯瞧,一...
    開封第一講書人閱讀 52,584評論 1 312
  • 那天,我揣著相機與錄音品擎,去河邊找鬼埋合。 笑死,一個胖子當(dāng)著我的面吹牛萄传,可吹牛的內(nèi)容都是我干的甚颂。 我是一名探鬼主播,決...
    沈念sama閱讀 41,085評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼秀菱,長吁一口氣:“原來是場噩夢啊……” “哼振诬!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起衍菱,我...
    開封第一講書人閱讀 40,023評論 0 277
  • 序言:老撾萬榮一對情侶失蹤赶么,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后脊串,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體辫呻,經(jīng)...
    沈念sama閱讀 46,555評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,626評論 3 342
  • 正文 我和宋清朗相戀三年琼锋,在試婚紗的時候發(fā)現(xiàn)自己被綠了放闺。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,769評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡缕坎,死狀恐怖怖侦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情谜叹,我是刑警寧澤匾寝,帶...
    沈念sama閱讀 36,439評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站叉谜,受9級特大地震影響旗吁,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜停局,卻給世界環(huán)境...
    茶點故事閱讀 42,115評論 3 335
  • 文/蒙蒙 一很钓、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧董栽,春花似錦码倦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,601評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擒抛,卻和暖如春推汽,著一層夾襖步出監(jiān)牢的瞬間补疑,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,702評論 1 274
  • 我被黑心中介騙來泰國打工歹撒, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留莲组,地道東北人。 一個月前我還...
    沈念sama閱讀 49,191評論 3 378
  • 正文 我出身青樓暖夭,卻偏偏與公主長得像锹杈,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子迈着,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,781評論 2 361

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