js面向?qū)ο缶幊谈攀?/h1>

問(wèn):在js里面被<code>new</code>之后的函數(shù)和普通的函數(shù)有何區(qū)別嗎?

1. New命令#

1.1 基本用法
<code>new</code>命令的作用,就是執(zhí)行<code>構(gòu)造函數(shù)</code>,返回一個(gè)<code>實(shí)例對(duì)象</code>。

var Person = function(name){
    this.name = name;
}

var p1 = new Person("張三");
var p2 = new Person("李四");

//p1和p2都是Person這個(gè)類(構(gòu)造函數(shù))的實(shí)例
p1.name//張三
p2.name//李

如果不用<code>new</code>將函數(shù)賦值給一個(gè)變量掷空,會(huì)如何呢?

var Person = function(name){
    this.name = name;
}

var p1 =  Person("張三"); 
p1//undefined
name//張三
var p2 =  Person("李四");
p2//unddefined
name//李四

var Animate = function(type){
  'use strict';
  this.type = type
}

var dog = new Animate("dog");
//TypeError: Cannot set property 'type ' of undefined
//因?yàn)?use strict 是嚴(yán)格模式

上面代碼分別調(diào)用兩次<code>Person</code>函數(shù)囤锉,但由于<code>Person</code>函數(shù)沒(méi)有返回值坦弟,所以,<code>p1,p2</code>都為<code>undefined</code>官地。<code>this</code>表示當(dāng)前作用域酿傍,由于沒(méi)有<code>new</code>,當(dāng)前的作用域仍然是全局的。所以驱入,最后<code>name</code>為"李四"

1.2 new原理

創(chuàng)建一個(gè)空對(duì)象赤炒,作為將要返回的對(duì)象實(shí)例
將這個(gè)空對(duì)象的原型,指向構(gòu)造函數(shù)的<code>prototype</code>屬性
將這個(gè)空對(duì)象賦值給函數(shù)內(nèi)部的<code>this</code>關(guān)鍵字
開(kāi)始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼

如果構(gòu)造函數(shù)內(nèi)部有<code>return</code>語(yǔ)句亏较,而且<code>return</code>后面跟著一個(gè)對(duì)象莺褒,<code>new</code>命令會(huì)返回<code>return</code>語(yǔ)句指定的對(duì)象;否則雪情,就會(huì)不管<code>return</code>語(yǔ)句遵岩,返回<code>this</code>對(duì)象

var Vehicle = function () {
   this.price = 1000; 
   return 1000;
};
(new Vehicle()) === 1000
//上面代碼中,構(gòu)造函數(shù)Vehicle的return語(yǔ)句返回一個(gè)數(shù)值巡通。
//這時(shí)尘执,new命令就會(huì)忽略這個(gè)return語(yǔ)句,返回“構(gòu)造”后的this對(duì)象

但是扁达,如果<code>return</code>語(yǔ)句返回的是一個(gè)跟<code>this</code>無(wú)關(guān)的新對(duì)象正卧,<code>new</code>命令會(huì)返回這個(gè)新對(duì)象蠢熄,而不是<code>this</code>對(duì)象跪解。這一點(diǎn)需要特別引起注意。

var Vehicle = function (){
 this.price = 1000;
 return { price: 2000 };
};
(new Vehicle()).price// 2000

另一方面,如果對(duì)普通函數(shù)(內(nèi)部沒(méi)有<code>this</code>關(guān)鍵字的函數(shù))使用<code>new</code>命令叉讥,則會(huì)返回一個(gè)空對(duì)象窘行。

function getMessage() { 
  return 'this is a message';
}
var msg = new getMessage();
msg // {}
typeof msg // "Object"

<code>new</code>命令簡(jiǎn)化的流程

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

function _new(/* 構(gòu)造函數(shù) */ constructor, /* 構(gòu)造函數(shù)參數(shù) */ param1) {
  // 將 arguments 對(duì)象轉(zhuǎn)為數(shù)組
  var args = [].slice.call(arguments);
  // 取出構(gòu)造函數(shù)
  var constructor = args.shift();
  // 創(chuàng)建一個(gè)空對(duì)象,繼承構(gòu)造函數(shù)的 prototype 屬性
  var context = Object.create(constructor.prototype);
  // 執(zhí)行構(gòu)造函數(shù)
  var result = constructor.apply(context, args);
  // 如果返回結(jié)果是對(duì)象图仓,就直接返回罐盔,則返回 context 對(duì)象
  return (typeof result === 'object' && result != null) ? result : context;
}

var p = _new(Persion, "xxx");
console.info(p.name); //xxx

2. Object對(duì)象與繼承#

2.1 Object.getOwnPropertyNames()
<code>Object.getOwnPropertyNames</code>方法返回一個(gè)數(shù)組,成員是對(duì)象本身的所有屬性的鍵名救崔,不包含繼承的屬性鍵名惶看。

Object.getOwnPropertyNames(Date);
//["length", "name", "arguments", "caller", "prototype", "now", "parse", "UTC"]

var a = {};
Object.getOwnPropertyNames(a);
//[]

2.2 Object.prototype.hasOwnProperty()
對(duì)象實(shí)例的<code>hasOwnProperty</code>方法返回一個(gè)布爾值,用于判斷某個(gè)屬性定義在對(duì)象自身六孵,還是定義在原型鏈上

Date.hasOwnProperty('length')// true
Date.hasOwnProperty('toString')// false

2.3 in 運(yùn)算符和 for…in 循環(huán)
in運(yùn)算符返回一個(gè)布爾值纬黎,表示一個(gè)對(duì)象是否具有某個(gè)屬性颓鲜。它不區(qū)分該屬性是對(duì)象自身的屬性沮明,還是繼承的屬性。

'length' in Date // true
'toString' in Date // true
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者

  • 序言:七十年代末仙蛉,一起剝皮案震驚了整個(gè)濱河市主巍,隨后出現(xiàn)的幾起案子冠息,更是在濱河造成了極大的恐慌,老刑警劉巖孕索,帶你破解...
    沈念sama閱讀 221,695評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件逛艰,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡檬果,警方通過(guò)查閱死者的電腦和手機(jī)瓮孙,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,569評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)选脊,“玉大人杭抠,你說(shuō)我怎么就攤上這事】疑叮” “怎么了偏灿?”我有些...
    開(kāi)封第一講書人閱讀 168,130評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)钝的。 經(jīng)常有香客問(wèn)我翁垂,道長(zhǎng),這世上最難降的妖魔是什么硝桩? 我笑而不...
    開(kāi)封第一講書人閱讀 59,648評(píng)論 1 297
  • 正文 為了忘掉前任沿猜,我火速辦了婚禮,結(jié)果婚禮上碗脊,老公的妹妹穿的比我還像新娘啼肩。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,655評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布祈坠。 她就那樣靜靜地躺著害碾,像睡著了一般。 火紅的嫁衣襯著肌膚如雪赦拘。 梳的紋絲不亂的頭發(fā)上慌随,一...
    開(kāi)封第一講書人閱讀 52,268評(píng)論 1 309
  • 那天,我揣著相機(jī)與錄音躺同,去河邊找鬼阁猜。 笑死,一個(gè)胖子當(dāng)著我的面吹牛蹋艺,可吹牛的內(nèi)容都是我干的蹦漠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,835評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼车海,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼笛园!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起侍芝,我...
    開(kāi)封第一講書人閱讀 39,740評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤研铆,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后州叠,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體棵红,經(jīng)...
    沈念sama閱讀 46,286評(píng)論 1 318
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,375評(píng)論 3 340
  • 正文 我和宋清朗相戀三年咧栗,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了逆甜。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,505評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡致板,死狀恐怖交煞,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情斟或,我是刑警寧澤素征,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布,位于F島的核電站萝挤,受9級(jí)特大地震影響御毅,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜怜珍,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,873評(píng)論 3 333
  • 文/蒙蒙 一端蛆、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧酥泛,春花似錦今豆、人聲如沸侈沪。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 32,357評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至瘦馍,卻和暖如春歼秽,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背情组。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,466評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工燥筷, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人院崇。 一個(gè)月前我還...
    沈念sama閱讀 48,921評(píng)論 3 376
  • 正文 我出身青樓肆氓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親底瓣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子谢揪,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,515評(píng)論 2 359

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

  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語(yǔ)法,類相關(guān)的語(yǔ)法捐凭,內(nèi)部類的語(yǔ)法拨扶,繼承相關(guān)的語(yǔ)法,異常的語(yǔ)法茁肠,線程的語(yǔ)...
    子非魚_t_閱讀 31,664評(píng)論 18 399
  • 一直以為患民,如果沒(méi)有王政君,王莽不會(huì)篡權(quán)垦梆,漢朝的歷史也許不會(huì)分為西漢和東漢了…… 然而匹颤,王莽還是篡了權(quán),漢朝還是分了...
    小笨的日記閱讀 468評(píng)論 2 4
  • 詞作:動(dòng)力單車 ………………………… 在一個(gè)寂靜的深夜里 幾段思緒 就像長(zhǎng)江水翻來(lái)覆去 就這樣坐起 翻看多年前的相...
    云山任野閱讀 306評(píng)論 0 3
  • 感情里最怕的是托猩,他從沒(méi)說(shuō)過(guò)一句“我愛(ài)你”印蓖,你卻句句都是“我愿意”。 01 前陣子寫了一篇《我主動(dòng)找你聊天京腥,就是因?yàn)?..
    徐慕熹微閱讀 929評(píng)論 13 25