JavaScript淺析 -- new構造對象

一、構造對象的幾種方式

1.字面量法:
var person1 = {
    name: 'peter',
    age: 18,
    sex: 'boy',
    getAge: function() {
        return this.age;
    }
}
var person2 = {
    name: 'john',
    age: 22,
    sex: 'boy',
    getAge: function() {
        return this.age;
    }
}

字面量法就是簡單的key:value直接創(chuàng)建年鸳,但是有以下兩個缺點:

  • 構造麻煩。每次操作都要給所有的變量賦值仙粱,都是重復操作的復制粘貼代碼很多仅叫。
  • 每個使用者都需要了解詳細的內部細節(jié)帜篇,即使只是想個性化改變下name糙捺。
2. 函數(shù)自動化法:
function createPerson(name, age) {
    return {
        name: name,
        age: age,
        getAge: function() {
            return this.age;
        }
    }
}
var person1 = createPerson('peter', 18);
  • 優(yōu)點:使用此法簡化了構造的過程诫咱,每次構造只要調用函數(shù)并傳入對應的參數(shù)即可。也不需要知道內部實現(xiàn)的邏輯洪灯。
  • 缺點:函數(shù)返回的都是一個Object類型的對象坎缭,辨識度不高。
3. 構造函數(shù)法:
function Person(name, age) {
    this.name = name;
    this.age = age;
    this.getAge = function() {
        return this.age;
    }
}
var person1 = new Person('peter', 18);

function Car(speed) {
    this.speed = speed;
}
var car1 = new Car(50);

用這種方法構造出來的對象類型可以自由定義签钩,比如上面的person1的類型對象是Person掏呼,car1是Car,很好區(qū)分铅檩。如果用第二種的話則他們的類型都是Object憎夷。

二、new的過程發(fā)生了啥

也許有些小伙伴會有疑惑昧旨,為啥會有個new拾给,而不是直接執(zhí)行方法,這個new到底做了些啥兔沃?其實蒋得,在new的過程中,主要做了這三件事:

  1. 創(chuàng)建一個空的對象乒疏,并將該對象的proto指向了Person.prototype额衙。
  2. 執(zhí)行函數(shù),函數(shù)里面對this操作相當于對這個新建的空的對象操作怕吴。
  3. 函數(shù)執(zhí)行完畢之后窍侧,返回這個空的對象。
原型圖

如上圖转绷,是構造函數(shù)法代碼的簡單原型圖伟件。每個對象都有一個_proto_,每個方法都有一個prototype暇咆,而new的最重要一步就是將生成空對象的_proto_指向了Person的prototype锋爪。

三、new一些補充

  1. new本身就能執(zhí)行構造函數(shù)爸业,所以后面加不加括號都無所謂其骄,但是為了表示是個函數(shù),推薦加上括號扯旷。
  2. 若構造函數(shù)前不加new拯爽,則相當于普通的執(zhí)行方法,就不再執(zhí)行上面說的new的過程钧忽,會導致其中的this不再指向實例對象毯炮,所以記得加new逼肯。若普通函數(shù)(內部沒有this)加new,則返回一個空對象桃煎。
  3. 在構造函數(shù)里篮幢,可以通過new.target獲得當前的構造函數(shù),若返回undefined則證明當前沒有使用new操作为迈。另一種方法是判斷this instanceof 構造函數(shù)三椿,看是否返回true來判斷是否使用new,若為false則返回new 構造函數(shù)()葫辐。
function f() {
  if (!new.target) {
    throw new Error('請使用 new 命令調用搜锰!');
  }
}
f(); // Uncaught Error: 請使用 new 命令調用!
  1. 構造函數(shù)的最后不需要return耿战。若加了return且返回了一個對象蛋叼,則會用該對象替換當前創(chuàng)建的實例對象。若返回基本數(shù)據(jù)類型則忽略返回原來實例對象剂陡。
var Human = function (){
  this.age = 18;
  return { age: 20 };
};
(new Human()).age; // 20

var Human = function () {
  this.age = 18;
  return 66;
};
(new Human()) === 66; // false
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末狈涮,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子鹏倘,更是在濱河造成了極大的恐慌薯嗤,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件纤泵,死亡現(xiàn)場離奇詭異骆姐,居然都是意外死亡,警方通過查閱死者的電腦和手機捏题,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進店門玻褪,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人公荧,你說我怎么就攤上這事带射。” “怎么了循狰?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵窟社,是天一觀的道長。 經(jīng)常有香客問我绪钥,道長灿里,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任程腹,我火速辦了婚禮匣吊,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己色鸳,他們只是感情好社痛,可當我...
    茶點故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著命雀,像睡著了一般蒜哀。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上咏雌,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天凡怎,我揣著相機與錄音校焦,去河邊找鬼赊抖。 笑死,一個胖子當著我的面吹牛寨典,可吹牛的內容都是我干的氛雪。 我是一名探鬼主播,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼耸成,長吁一口氣:“原來是場噩夢啊……” “哼报亩!你這毒婦竟也來了?” 一聲冷哼從身側響起井氢,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤弦追,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后花竞,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體劲件,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年约急,在試婚紗的時候發(fā)現(xiàn)自己被綠了零远。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡厌蔽,死狀恐怖牵辣,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情奴饮,我是刑警寧澤纬向,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站戴卜,受9級特大地震影響逾条,放射性物質發(fā)生泄漏。R本人自食惡果不足惜叉瘩,卻給世界環(huán)境...
    茶點故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一膳帕、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦危彩、人聲如沸攒磨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽娩缰。三九已至,卻和暖如春谒府,著一層夾襖步出監(jiān)牢的瞬間拼坎,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工完疫, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留泰鸡,地道東北人。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓壳鹤,卻偏偏與公主長得像盛龄,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子芳誓,可洞房花燭夜當晚...
    茶點故事閱讀 45,033評論 2 355