this_原型鏈_繼承

this

apply括袒、call 哆致、bind有什么作用硅蹦,什么區(qū)別?

  • apply() 方法調用一個函數, 其具有一個指定的this值,以及作為一個數組(或類似數組的對象)提供的參數昨凡。

    語法:fun.apply(thisArg, [argsArray])
    thisArg:
      在 fun 函數運行時指定的 this 值。如果這個函數處于非嚴格模式下蚁署,則指定為 null 或
      undefined 時會自動指向全局對象便脊。
    argsArray:
      一個數組或者類數組對象,其中的數組元素將作為單獨的參數傳給 fun 函數光戈。
    
  • call()方法和apply()方法類似哪痰,只有一個區(qū)別,計算call()方法接收若干個參數的列表田度,而apply()方法接收的是一個包含多個參數的數組妒御。

  • bind()方法創(chuàng)建一個新的函數, 當被調用時,將其this關鍵字設置為提供的值镇饺,在調用新函數時乎莉,在任何提供之前提供一個給定的參數序列。

    語法:fun.bind(thisArg[, arg1[, arg2[, ...]]])
    thisArg
      當綁定函數被調用時奸笤,該參數會作為原函數運行時的 this 指向作儿。當使用new 操作符調用綁定函數時,
      該參數無效青伤。
    arg1, arg2, ...
      當綁定函數被調用時潦牛,這些參數將置于實參之前傳遞給被綁定的方法。
    返回值
      返回由指定的this值和初始化參數改造的原函數拷貝
    

以下代碼輸出什么?

var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()  // John: hi!
// this為執(zhí)行上下文健盒,當一個函數作為對象的方法調用時绒瘦,this默認指向這個對象

下面代碼輸出什么,為什么扣癣?

func() // [object Window]
function func() { 
  alert(this)
}
// 當直接調用一個函數時惰帽,相當于執(zhí)行window.func()所以this指向window對象

下面代碼輸出什么?

document.addEventListener('click', function(e){
    console.log(this);
    setTimeout(function(){
        console.log(this);
    }, 200);
}, false);
// 輸出:#document  父虑、     Window{}
// 第一個:事件中的this默認指向綁定這個事件的對象该酗。
// 第二個:setTimeout的執(zhí)行函數中的this默認指向window對象

下面代碼輸出什么,why?

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john) // Jojn
// call方法用于在函數運行時指定this指,因此執(zhí)行以上代碼時this指向john對象

以下代碼有什么問題呜魄,如何修改

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指$btn對象
      this.showMsg();
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}
// 在事件處理函數中this指向$btn,而$btn沒有showMsg()方法
// 修改:將外部this保存到一個變量中
var module= {
  bind: function(){
    var self = this
    $btn.on('click', function(){
      console.log(this)
      self.showMsg();
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}

原型鏈

有如下代碼悔叽,解釋Person、 prototype爵嗅、proto娇澎、p、constructor之間的關聯(lián)操骡。

function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();  // 'My name is: 若愚'
// Person是一個函數九火,它擁有一個prototype屬性,這個屬性指向一個對象册招,而這個對象擁有一個
constructor屬性岔激,這個屬性指向Person函數
// 當Person作為構造函數調用時,會先初始化一個對象是掰,將this指向這個對象虑鼎,并將它的__proto__屬性指
向Person.prototype,因此p.name === "若愚",p.sayName() === Person.prototype.sayName()

上例中,對對象 p可以這樣調用 p.toString()键痛。toString是哪里來的? 畫出原型圖?并解釋什么是原型鏈炫彩。

  • toString來自Object.prototype。如圖:
  • 如上圖所示絮短,當在Person的原型找不到某個方法時江兢,就會沿著它的__proto__逐層向上,直到找到或__proto__屬性為空為止丁频,這個__proto__屬性組成的鏈杉允,就是原型鏈

對String做擴展,實現(xiàn)如下方式獲取字符串中頻率最高的字符

String.prototype.getMostOften = function() {
  var  obj = {}
  var strArr = this.split('')
  strArr.forEach(function(i) {
    if (obj[i]) {
      obj[i]++
    } else {
      obj[i] = 1
    }
  })

  var max = 0, maxStr
  for (var x in obj) {
    if (obj[x] > max) {
      maxStr = x
      max = obj[x]
    }
  }

  return maxStr
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d

instanceOf有什么作用席里?內部邏輯是如何實現(xiàn)的叔磷?

  • instanceof用于判斷一個對象的類型,那么它的判斷規(guī)則是什么奖磁?
    • Instanceof運算符的第一個變量一般是一個對象改基,暫時稱為A;第二個變量一般是一個函數咖为,暫時稱為B秕狰。
    • Instanceof的判斷規(guī)則是:沿著A的__proto__這條線來找,同時沿著B的prototype這條線來找躁染,如果兩條線能找到同一個引用封恰,即同一個對象,那么就返回true褐啡。如果找到終點還未重合,則返回false鳖昌。

繼承

繼承有什么作用?

  • 繼承關系是傳遞的备畦。若類C繼承類B低飒,類B繼承類A,則類C既有從類B那里繼承下來的屬性與方法懂盐,也有從類A那里繼承下來的屬性與方法褥赊,還可以有自己新定義的屬性和方法。繼承來的屬性和方法盡管是隱式的莉恼,但仍是類C的屬性和方法拌喉。繼承是在一些比較一般的類的基礎上構造、建立和擴充新類的最有效的手段俐银。
  • 繼承提供了軟件復用功能尿背。若類B繼承類A,那么建立類B時只需要再描述與基類(類A)不同的少量特征(數據成員和成員方法)即可捶惜。這種做法能減小代碼和數據的冗余度田藐,大大增加程序的重用性。
  • 繼承通過增強一致性來減少模塊間的接口和界面吱七,大大增加了程序的易維護性汽久。

下面兩種寫法有什么區(qū)別?

//方法1
function People(name, sex){
    this.name = name;
    this.sex = sex;
    this.printName = function(){
        console.log(this.name);
    }
}
var p1 = new People('饑人谷', 2)

//方法2
function Person(name, sex){
    this.name = name;
    this.sex = sex;
}

Person.prototype.printName = function(){
    console.log(this.name);
}
var p1 = new Person('若愚', 27);

// 區(qū)別:使用方法1構造的每個對象都擁有相同的printName方法,
使用方法2構造的每個對象調用printName方法時都是調用的Person.prototype.printName方法
方法2大大節(jié)省了內存

Object.create 有什么作用踊餐?兼容性如何景醇?

  • Object.create() 方法會使用指定的原型對象及其屬性去創(chuàng)建一個新的對象。兼容ie9及以上瀏覽器

    var p1 = Object.create(xxx.prototype)   相當于:
    var fn = {}
    fn.__proto__ = xxx.prototype
    var p1 = fn
    

hasOwnProperty有什么作用吝岭? 如何使用三痰?

  • hasOwnProperty() 方法會返回一個布爾值,指示對象是否具有指定的屬性作為自身(不繼承)屬性苍碟。

    遍歷一個對象所有自身屬性:
    var buz = {
        fog: 'stack'
    };
    
    for (var name in buz) {
        if (buz.hasOwnProperty(name)) {
            alert("this is fog (" + name + ") for sure. Value: " + buz[name]);
        }
    }
    

如下代碼中call的作用是什么?

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
function Male(name, sex, age){
    Person.call(this, name, sex);    
    //調用Person函數酒觅,并把它的this變?yōu)镸ale函數的this,用此方法可實現(xiàn)對Person實例屬性的繼承
    this.age = age;
}

補全代碼微峰,實現(xiàn)繼承

function Person(name, sex){
    this.name = name
    this.sex = sex
}

Person.prototype.printName = function(){
    console.log(this.name)
};    

function Male(name, sex, age){
  Person.call(this, name, sex)
  this.age = age
}

Male.prototype = Object.create(Person.prototype)
Male.prototype.constructor = Male

Male.prototype.getAge = function(){
    console.log(this.age)
};

var ruoyu = new Male('若愚', '男', 27);
ruoyu.printName();
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末舷丹,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蜓肆,更是在濱河造成了極大的恐慌颜凯,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,542評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件仗扬,死亡現(xiàn)場離奇詭異症概,居然都是意外死亡,警方通過查閱死者的電腦和手機早芭,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,596評論 3 385
  • 文/潘曉璐 我一進店門彼城,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事募壕〉骶妫” “怎么了?”我有些...
    開封第一講書人閱讀 158,021評論 0 348
  • 文/不壞的土叔 我叫張陵舱馅,是天一觀的道長缰泡。 經常有香客問我,道長代嗤,這世上最難降的妖魔是什么棘钞? 我笑而不...
    開封第一講書人閱讀 56,682評論 1 284
  • 正文 為了忘掉前任,我火速辦了婚禮干毅,結果婚禮上宜猜,老公的妹妹穿的比我還像新娘。我一直安慰自己溶锭,他們只是感情好宝恶,可當我...
    茶點故事閱讀 65,792評論 6 386
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著趴捅,像睡著了一般垫毙。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上拱绑,一...
    開封第一講書人閱讀 49,985評論 1 291
  • 那天综芥,我揣著相機與錄音,去河邊找鬼猎拨。 笑死膀藐,一個胖子當著我的面吹牛,可吹牛的內容都是我干的红省。 我是一名探鬼主播额各,決...
    沈念sama閱讀 39,107評論 3 410
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼吧恃!你這毒婦竟也來了虾啦?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 37,845評論 0 268
  • 序言:老撾萬榮一對情侶失蹤痕寓,失蹤者是張志新(化名)和其女友劉穎傲醉,沒想到半個月后,有當地人在樹林里發(fā)現(xiàn)了一具尸體呻率,經...
    沈念sama閱讀 44,299評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡硬毕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,612評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了礼仗。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吐咳。...
    茶點故事閱讀 38,747評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡逻悠,死狀恐怖,靈堂內的尸體忽然破棺而出韭脊,到底是詐尸還是另有隱情蹂风,我是刑警寧澤,帶...
    沈念sama閱讀 34,441評論 4 333
  • 正文 年R本政府宣布乾蓬,位于F島的核電站,受9級特大地震影響慎恒,放射性物質發(fā)生泄漏任内。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 40,072評論 3 317
  • 文/蒙蒙 一融柬、第九天 我趴在偏房一處隱蔽的房頂上張望死嗦。 院中可真熱鬧,春花似錦粒氧、人聲如沸越除。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,828評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽摘盆。三九已至,卻和暖如春饱苟,著一層夾襖步出監(jiān)牢的瞬間孩擂,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,069評論 1 267
  • 我被黑心中介騙來泰國打工箱熬, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留类垦,地道東北人。 一個月前我還...
    沈念sama閱讀 46,545評論 2 362
  • 正文 我出身青樓城须,卻偏偏與公主長得像蚤认,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子糕伐,可洞房花燭夜當晚...
    茶點故事閱讀 43,658評論 2 350

推薦閱讀更多精彩內容

  • 1: apply砰琢、call 、bind有什么作用赤炒,什么區(qū)別 call 和 apply 都是為了改變某個函數運行時的...
    高進哥哥閱讀 251評論 0 0
  • 1. apply氯析、call 、bind有什么作用莺褒,什么區(qū)別掩缓? call ,apply的作用:調用一個函數,傳入函數...
    Rising_suns閱讀 390評論 0 0
  • this 相關問題 1. apply遵岩、call 你辣、bind有什么作用巡通,什么區(qū)別 bind()方法創(chuàng)建一個新的函數,...
    饑人谷_流水閱讀 239評論 0 0
  • 一、this 相關問題 知乎上關于this的解答 this 的值到底是什么舍哄?一次說清楚 this 的工作原理在js...
    66dong66閱讀 549評論 0 0
  • 寡言君原創(chuàng)宴凉,轉載請注明出處 一個優(yōu)秀的運營在做事的時候,思維方式和普通人會有些差異表悬,運營本身就像打怪升級一樣弥锄,靠的...
    寡言君閱讀 1,561評論 9 69