javascript 對象封裝的常用方式

趁著等服務端接口的一點點時間嘹裂,網(wǎng)上看了幾個關于js對象封裝的例子,自己再重新手敲一遍上忍,總結一下,溫故而知新诱咏。(大艾斯鎮(zhèn)樓)

QQ圖片20170418093319.jpg

JS是一門面向對象語言,其對象是用prototype屬性來模擬的缴挖,下面袋狞,來看看如何封裝JS對象。

常規(guī)封裝
function Person(name, age, sex){
    this.name = name;
    this.age = age;
    this.sex = sex;
}

Person.prototype = {
    constructor: Person,
    sayHello: function(){
        console.log('hello);
    }
}

這種方式是比較常見的映屋,比較直觀苟鸯,但是Person()的職責是構造對象,如果把初始化的事情放在里面完成棚点,代碼就會顯得繁瑣早处,如果放在一個方法里初始化會不會好點呢?

升級版(常見)
function Person(info){
    this._init_(info);
}

Person.prototype = {
    constructor: Person,
    _init_: function(info){
        this.name = name;
        this.age = age;
        this.sex = sex;
    },
    sayHello: function(){
        console.log('hello');
    }
}

可是,說到這里就發(fā)現(xiàn),name,age,sex 并沒有在Person里面申明,哪來的呢???

new 的執(zhí)行原理

new 的執(zhí)行過程可以用下面一個函數(shù)來代替

var myNew = function(constructor, args){
    var o = {};
    o.__proto__ = constructor.prototype;
    var res = constructor.apply(0, args);
    var type = typeof(res);
    if(['string', 'number', 'boolean', 'null', 'undefined'].indexOf(type) !== -1){
        return o;
    }
    return res;
}

解釋:
首先通過 var o = {} 構造一個空對象.
然后將 構造函數(shù)的原型屬性prototype賦值給o 的原型對象proto 瘫析。這樣砌梆,在執(zhí)行 this.init(info); 這句話的時候,對象 o 就可以在其原型對象中查找init 方法贬循。(原型鏈)咸包。
之后這句話 就是精髓了。

var res = constructor.apply(o,args);

以o為上下文調用函數(shù)杖虾,同時將參數(shù)作為數(shù)組傳遞烂瘫。那么,

 this._init_(info);

這句話就會被 o 執(zhí)行奇适, 函數(shù)

 _init_ : function(info) {
    this.name = info.name;
    this.age = info.age;
    this.sex = info.sex;
}

以 o 為上下文調用坟比,o也將擁有自己的 name,age,sex 屬性。

如果在構造函數(shù)中嚷往,return 復合類型葛账,包括對象,函數(shù)间影,和正則表達式注竿,那么就會直接返回這個對象茄茁,否則魂贬,返回 o 。

var type = typeof res;
if(['string','number','boolean','null','undefined'].indexOf(type) !== -1){
    return o;
}
return res;

測試一下

function Person(name) {
    this.name = name;
}
Person.prototype.sayHello = function() {
    console.log(this.name);
}
var o1 = myNew(Person, ['pawn']);
console.log(o1); //{name: pawn}
o1.sayHello(); //pawn

OK裙顽,大功告成付燥!

此外,再補充幾點愈犹,
只有函數(shù)才有prototype屬性,這個屬性值為一個object對象键科,
實例對象時沒有這個屬性的闻丑,實例對象通過proto這個內部屬性([[prototype]])來串起一個原型鏈的,通過這個原型鏈可以查找屬性勋颖,方法嗦嗡,
通過new操作符初始化一個函數(shù)對象的時候就會構建出一個實例對象,函數(shù)對象的prototype屬性指向的對象就是這個實例對象的原型對象饭玲,也就是proto指向的對象
所有構造器/函數(shù)的proto都指向Function.prototype侥祭,它是一個空函數(shù)(Empty function)

Number.__proto__ === Function.prototype  // true
Boolean.__proto__ === Function.prototype // true
String.__proto__ === Function.prototype  // true
Object.__proto__ === Function.prototype  // true
Function.__proto__ === Function.prototype // true
Array.__proto__ === Function.prototype   // true
RegExp.__proto__ === Function.prototype  // true
Error.__proto__ === Function.prototype   // true
Date.__proto__ === Function.prototype    // true

JavaScript中有內置(build-in)構造器/對象共計12個(ES5中新加了JSON),這里列舉了可訪問的8個構造器茄厘。剩下如Global不能直接訪問矮冬,Arguments僅在函數(shù)調用時由JS引擎創(chuàng)建,Math次哈,JSON是以對象形式存在的胎署,無需new。它們的proto是Object.prototype窑滞。如下

Math.__proto__ === Object.prototype  // true
JSON.__proto__ === Object.prototype  // true

Function.prototype也是唯一一個typeof XXX.prototype為 “function”的prototype琼牧。其它的構造器的prototype都是一個對象。如下

console.log(typeof Function.prototype) // function
console.log(typeof Object.prototype)   // object
console.log(typeof Number.prototype)   // object
console.log(typeof Boolean.prototype)  // object
console.log(typeof String.prototype)   // object
console.log(typeof Array.prototype)    // object
console.log(typeof RegExp.prototype)   // object
console.log(typeof Error.prototype)    // object
console.log(typeof Date.prototype)     // object
console.log(typeof Object.prototype)   // object

相信都聽說過JavaScript中函數(shù)也是一等公民哀卫,那從哪能體現(xiàn)呢障陶?如下

console.log(Function.prototype.__proto__ === Object.prototype) // true

最后Object.prototype的proto是誰?

Object.prototype.__proto__ === null  // true

已經(jīng)到頂了聊训,為null抱究。

時間有限,未完待續(xù)带斑。鼓寺。。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末勋磕,一起剝皮案震驚了整個濱河市妈候,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌挂滓,老刑警劉巖苦银,帶你破解...
    沈念sama閱讀 211,348評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異赶站,居然都是意外死亡幔虏,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,122評論 2 385
  • 文/潘曉璐 我一進店門贝椿,熙熙樓的掌柜王于貴愁眉苦臉地迎上來想括,“玉大人,你說我怎么就攤上這事烙博∩冢” “怎么了烟逊?”我有些...
    開封第一講書人閱讀 156,936評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長铺根。 經(jīng)常有香客問我宪躯,道長,這世上最難降的妖魔是什么位迂? 我笑而不...
    開封第一講書人閱讀 56,427評論 1 283
  • 正文 為了忘掉前任眷唉,我火速辦了婚禮,結果婚禮上囤官,老公的妹妹穿的比我還像新娘冬阳。我一直安慰自己,他們只是感情好党饮,可當我...
    茶點故事閱讀 65,467評論 6 385
  • 文/花漫 我一把揭開白布肝陪。 她就那樣靜靜地躺著,像睡著了一般刑顺。 火紅的嫁衣襯著肌膚如雪氯窍。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,785評論 1 290
  • 那天蹲堂,我揣著相機與錄音狼讨,去河邊找鬼。 笑死柒竞,一個胖子當著我的面吹牛政供,可吹牛的內容都是我干的。 我是一名探鬼主播朽基,決...
    沈念sama閱讀 38,931評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼布隔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了稼虎?” 一聲冷哼從身側響起衅檀,我...
    開封第一講書人閱讀 37,696評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎霎俩,沒想到半個月后哀军,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,141評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡打却,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,483評論 2 327
  • 正文 我和宋清朗相戀三年杉适,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片学密。...
    茶點故事閱讀 38,625評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡淘衙,死狀恐怖,靈堂內的尸體忽然破棺而出腻暮,到底是詐尸還是另有隱情彤守,我是刑警寧澤,帶...
    沈念sama閱讀 34,291評論 4 329
  • 正文 年R本政府宣布哭靖,位于F島的核電站具垫,受9級特大地震影響,放射性物質發(fā)生泄漏试幽。R本人自食惡果不足惜筝蚕,卻給世界環(huán)境...
    茶點故事閱讀 39,892評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望铺坞。 院中可真熱鬧起宽,春花似錦、人聲如沸济榨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,741評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽擒滑。三九已至腐晾,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間丐一,已是汗流浹背藻糖。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留库车,地道東北人巨柒。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像柠衍,于是被迫代替她去往敵國和親潘拱。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,492評論 2 348

推薦閱讀更多精彩內容