高級2 原型鏈 this

this 相關問題

問題1: apply菲盾、call 、bind有什么作用全谤,什么區(qū)別

**apply 和 call **
在 JavaScript 中寨典,call 和 apply 都是為了改變某個函數(shù)運行時的上下文(context)而存在的,換句話說想虎,就是為了改變函數(shù)體內(nèi)部 this 的指向卦尊。它們的作用都是一樣的,就是傳遞的參數(shù)不一樣舌厨。
apply 接受2個參數(shù)岂却,第一個參數(shù)指定了函數(shù)體內(nèi)this對象的指向,第二個參數(shù)為數(shù)組或者一個類數(shù)組裙椭,而call則作為call的參數(shù)傳入(從第二個參數(shù)開始)躏哩,如果call方法沒有參數(shù),或者參數(shù)為null或undefined揉燃,則等同于指向全局對象

func.call(this,3,4,5)
func.apply(this.[3,4,5])

所以震庭,一般當參數(shù)數(shù)量固定的時候用call不固定時用apply

bind
bind() 方法與 apply 和 call 很相似,也是可以改變函數(shù)體內(nèi) this 的指向你雌。
MDN的解釋是:bind()方法會創(chuàng)建一個新函數(shù),稱為綁定函數(shù),當調(diào)用這個綁定函數(shù)時婿崭,綁定函數(shù)會以創(chuàng)建它時傳入 bind()方法的第一個參數(shù)作為 this拨拓,傳入 bind() 方法的第二個以及以后的參數(shù)加上綁定函數(shù)運行時本身的參數(shù)按照順序作為原函數(shù)的參數(shù)來調(diào)用原函數(shù)。

var func = function(){
    console.log(this.x);
    console.log(arguments);
}
func();  // undefined, {}
var obj = {
    x: 2
}
var bar = func.bind(obj,1);
bar(); // 2 , {'0':1}

總結(jié)

  • apply 氓栈、 call 渣磷、bind 三者都是用來改變函數(shù)的this對象的指向的;
  • apply 授瘦、 call 醋界、bind 三者第一個參數(shù)都是this要指向的對象,也就是想指定的上下文提完;
  • apply 形纺、 call 、bind 三者都可以利用后續(xù)參數(shù)傳參徒欣;
  • bind 是返回對應函數(shù)逐样,便于稍后調(diào)用;apply 打肝、call 則是立即調(diào)用 脂新。

問題2: 以下代碼輸出什么?

var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi()//窗口彈出"John:'hi'"
//利用轉(zhuǎn)化代碼(下同) john.sayHi()相當于john.sayHi.call(john),this指向john

問題3: 下面代碼輸出什么,為什么

func() 
function func() { 
  alert(this)
} //窗口彈出“window”
//func() 可以簡寫為fun.call(undefined),call方法參數(shù)為null或undefined粗梭,則等同于指向全局對象

問題4: 下面代碼輸出什么争便,為什么

document.addEventListener('click', function(e){
    console.log(this);//輸出“document”,this指向調(diào)用該函數(shù)的document節(jié)點
    setTimeout(function(){
        console.log(this);//輸出“Window”,setTimeout函數(shù)中的this指向全局對象
    }, 200);
}, false);

問題5: 下面代碼輸出什么断医,為什么

var john = { 
  firstName: "John" 
}
function func() { 
  alert( this.firstName )
}
func.call(john) //窗口彈出“John”滞乙,this指向john對象

問題6: 以下代碼有什么問題,如何修改

var module= {
  bind: function(){
var  _this = this //修改部分
    $btn.on('click', function(){
      console.log(this) //this指向全局對象孩锡,window
      _this.showMsg();//修改部分
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}

原型鏈相關問題

問題7:有如下代碼酷宵,解釋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();

p 是Person的一個實例男韧,Person的prototype相當于由其構(gòu)造的實例的屬性方法的公共容器,p的proto指向Person的prototype默垄,Person的prototype里的proto指向Object的prototype此虑,Person的prototype里的constructor既是Person本身

問題8: 上例中,對對象 p可以這樣調(diào)用 p.toString()口锭。toString是哪里來的? 畫出原型圖?并解釋什么是原型鏈朦前。


在js中介杆,一切皆對象,每個對象都有一個指向它的原型的的內(nèi)部鏈接(此鏈接還沒有規(guī)范的訪問方式韭寸,一般用__proro__代替),這個原型也有自己的原型春哨,直到每個對象的原型為null為止,這就是原型鏈恩伺。toString()可以通過p.__proro__(指向Person.prototype).__proro__(指向Object.prototype)找到這個方法赴背,所以p可以調(diào)用toString()

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

var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
String.prototype.getMostOften=function(){
   var obj = {}
   for(var i = 0,j;i<this.length;i++){
      j = this[i]
      if(obj[j]){
        obj[j]++
      }else{
        obj[j] = 1
      }
   } 
   var max=0
   var key=0
    for(var k in obj){
        if(obj[k]>max){
          max = obj[k]
          key = k
        }
    }
    return key
}
var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現(xiàn)了5次

問題10: instanceOf有什么作用晶渠?內(nèi)部邏輯是如何實現(xiàn)的凰荚?

instanceof 運算符用來測試一個對象在其原型鏈中是否存在一個構(gòu)造函數(shù)的 prototype 屬性。instanceOf會判斷對象的.proto是否等于構(gòu)造函數(shù)的原型褒脯,如果不等便瑟,再判斷對象的proto.__proto__;直到null,如果都不等憨颠,則對象不是構(gòu)造函數(shù)的實例胳徽。

繼承相關問題

問題11:繼承有什么作用?

JavaScript 對象有一個指向一個原型對象的鏈。當試圖訪問一個對象的屬性或方法時爽彤,它不僅僅在該對象上搜尋养盗,還會搜尋該對象的原型,以及該對象的原型的原型适篙,依此層層向上搜索往核,直到找到一個名字匹配的屬性或到達原型鏈的末尾。這樣可以實現(xiàn)代碼重用嚷节,節(jié)省內(nèi)存聂儒,子類新增屬性或者方法也不會影響父類。

問題12: 下面兩種寫法有什么區(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);

方法1的printName()放在People的實例對象中硫痰,無法通過原型鏈來繼承調(diào)用衩婚,方法2中的printName()放在People的prototype中,可以通過原型鏈來繼承效斑、調(diào)用非春,從而節(jié)省內(nèi)存。

問題13: Object.create 有什么作用缓屠?兼容性如何奇昙?

Object.create() 方法使用指定的原型對象和其屬性創(chuàng)建了一個新的對象。
用法:

function inherit(superType, subType){
    var _prototype  = Object.create(superType.prototype);
    _prototype.constructor = subType;
    subType.prototype = _prototype;
}

兼容性:


兼容性

問題14: hasOwnProperty有什么作用敌完? 如何使用储耐?

hasOwnPerperty是Object.prototype的一個方法,可以判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性滨溉。

m.hasOwnProperty('name'); // true
m.hasOwnProperty('printName'); // false
Male.prototype.hasOwnProperty('printAge'); // true

問題15:如下代碼中call的作用是什么?

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
function Male(name, sex, age){
    Person.call(this, name, sex);    //這里的 call 有什么作用
    this.age = age;
}

這里的 call 的作用是將執(zhí)行上下文(context)的環(huán)境切換到Person下什湘,也就是將Person的屬性賦值給Male

問題16: 補全代碼长赞,實現(xiàn)繼承

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

Person.prototype.getName = function(){
    console.log('my name is'+ this.name)
};    

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

Male.prototype =Object.create(Person.prototype)
Male.prototype.constructor = Male
Male.prototype.getAge = function(){
    console.log('my age is '+this.age)
};

var ruoyu = new Male('若愚', '男', 27);
ruoyu.getName();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市禽炬,隨后出現(xiàn)的幾起案子涧卵,更是在濱河造成了極大的恐慌,老刑警劉巖腹尖,帶你破解...
    沈念sama閱讀 206,378評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異伐脖,居然都是意外死亡热幔,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評論 2 382
  • 文/潘曉璐 我一進店門讼庇,熙熙樓的掌柜王于貴愁眉苦臉地迎上來绎巨,“玉大人,你說我怎么就攤上這事蠕啄〕∏冢” “怎么了?”我有些...
    開封第一講書人閱讀 152,702評論 0 342
  • 文/不壞的土叔 我叫張陵歼跟,是天一觀的道長和媳。 經(jīng)常有香客問我,道長哈街,這世上最難降的妖魔是什么留瞳? 我笑而不...
    開封第一講書人閱讀 55,259評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮骚秦,結(jié)果婚禮上她倘,老公的妹妹穿的比我還像新娘。我一直安慰自己作箍,他們只是感情好硬梁,可當我...
    茶點故事閱讀 64,263評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著胞得,像睡著了一般荧止。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上懒震,一...
    開封第一講書人閱讀 49,036評論 1 285
  • 那天罩息,我揣著相機與錄音,去河邊找鬼个扰。 笑死瓷炮,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的递宅。 我是一名探鬼主播娘香,決...
    沈念sama閱讀 38,349評論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼苍狰,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了烘绽?” 一聲冷哼從身側(cè)響起淋昭,我...
    開封第一講書人閱讀 36,979評論 0 259
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎安接,沒想到半個月后翔忽,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,469評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡盏檐,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,938評論 2 323
  • 正文 我和宋清朗相戀三年歇式,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片胡野。...
    茶點故事閱讀 38,059評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡材失,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出硫豆,到底是詐尸還是另有隱情龙巨,我是刑警寧澤,帶...
    沈念sama閱讀 33,703評論 4 323
  • 正文 年R本政府宣布熊响,位于F島的核電站旨别,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏耘眨。R本人自食惡果不足惜昼榛,卻給世界環(huán)境...
    茶點故事閱讀 39,257評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望剔难。 院中可真熱鬧胆屿,春花似錦、人聲如沸偶宫。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,262評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纯趋。三九已至憎兽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間吵冒,已是汗流浹背纯命。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留痹栖,地道東北人亿汞。 一個月前我還...
    沈念sama閱讀 45,501評論 2 354
  • 正文 我出身青樓,卻偏偏與公主長得像揪阿,于是被迫代替她去往敵國和親疗我。 傳聞我的和親對象是個殘疾皇子咆畏,可洞房花燭夜當晚...
    茶點故事閱讀 42,792評論 2 345

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