this & 原型鏈 & 繼承

this 相關(guān)

問題1: apply际乘、call 棒卷、bind有什么作用披粟,什么區(qū)別

apply()和call()方法都是在指定一個this值和參數(shù)的情況下調(diào)用某個函數(shù)赌髓。
bind()方法創(chuàng)建一個新的函數(shù), 當(dāng)被調(diào)用時从藤,它的this關(guān)鍵字被設(shè)置為提供的值 ,在調(diào)用新函數(shù)時春弥,提供任何一個給定的參數(shù)序列呛哟。
區(qū)別

  • apply與call只有一個區(qū)別
    • call()方法接受的是若干個參數(shù)的列表叠荠。fun.call(thisArg[, arg1[, arg2[, ...]]])
    • apply()方法接受的是一個包含多個參數(shù)的數(shù)組匿沛。fun.apply(thisArg[, argsArray])
  • bind()與call和apply不同之處在于它返回一個函數(shù), fun.bind(thisArg[, arg1[, arg2[, ...]]])

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

var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func
john.sayHi() //輸出john: hi! , 方法調(diào)用,this指向調(diào)用者

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

func()  //輸出window, this是全局對象
function func() { 
  alert(this)
}

問題4:下面代碼輸出什么

document.addEventListener('click', function(e){
    console.log(this);  //輸出document, 在事件處理程序中this代表事件源DOM對象
    setTimeout(function(){
        //輸出window, setTimeout和setInterval執(zhí)行的函數(shù)this是全局對象
        console.log(this);  
    }, 200);
}, false);

問題5:下面代碼輸出什么榛鼎,why

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john) //輸出John, call()的第一個參數(shù)指定了this為john對象

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

var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //這里的this指$btn
      this.showMsg();  //$btn上沒有showMsg()這個方法
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}
// 修改后
var module= {
  bind: function(){
    var _this = this //這時this的值是module, 把值存入_this
    $btn.on('click', function(){
      console.log(this)  //this為$btn 
      _this.showMsg();  //輸出饑人谷
    })
  },
  
  showMsg: function(){
    console.log('饑人谷');
  }
}

原型鏈相關(guān)問題

問題7:有如下代碼,解釋Person者娱、 prototype抡笼、__proto__ 、p黄鳍、constructor之間的關(guān)聯(lián)推姻。

  • Person是函數(shù)定義的類, 類(函數(shù))自動獲得屬性prototype。
  • p是Person的實例, 每個類的實例都會有一個內(nèi)部屬性__proto__ 框沟,指向類的prototype屬性
  • prototype是構(gòu)造函數(shù)內(nèi)部的原型對象藏古,所以擁有contructor和__proto__ 屬性。constructor指向了構(gòu)造函數(shù)Person忍燥。
function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log('My name is :' + this.name);
}
var p = new Person("若愚")
p.sayName();

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

當(dāng)調(diào)用p.tostring()時, 先會在p里找tostring方法, 找不到會沿著__proto__到 Person.prototype中找,還找不到就接著沿著__proto__找, 直到在object.prototype中找到為止
p.__proto__ ==> Person.prototype.__proto__ ==> object.prototype

原型圖.png

在 javaScript 中厂捞,每個對象都有一個指向它的原型(prototype)對象的內(nèi)部鏈接。這個原型對象又有自己的原型队丝,直到某個對象的原型為 null 為止(也就是不再有原型指向)靡馁,組成這條鏈的最后一環(huán)。這種一級一級的鏈結(jié)構(gòu)就稱為原型鏈(prototype chain)机久。

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

var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現(xiàn)了5次

代碼:

String.prototype.getMostOften = function(){
    var obj = {}
    for(var i=0; i< this.length; i++){
      if(obj[this.charAt(i)]){
        obj[this.charAt(i)]++
      }else if(!obj[this.charAt(i)]){
        obj[this.charAt(i)] = 1
      }
    }
  
  var max = 0,
      val = ''
  for(var key in obj){
    if(obj[key] > max){
      max = obj[key]
      val = key
    }
  }
  return val
}


var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現(xiàn)了5次

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

語法:object instanceof constructor
instanceof 運算符用來檢測 constructor.prototype 是否存在于參數(shù) object 的原型鏈上裙犹。即左側(cè)的對象是否是右側(cè)類的實例尽狠,如果是則表達式返回true;否則返回false叶圃。
內(nèi)部邏輯: 循環(huán)判斷 obj.__proto__.__proto__..... === con.prototype


繼承

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

繼承是指一個對象直接使用另一對象的屬性和方法袄膏。
優(yōu)點:

  • 優(yōu)化代碼結(jié)構(gòu)和對象關(guān)系
  • 優(yōu)化內(nèi)存空間, 一些共用的方法和屬性不用重復(fù)寫了. 子類需要添加或修改新的方法時, 可以重寫或擴展而不影響父類

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

方法2把printName寫到了原型鏈里, 節(jié)約了代碼量, 提高了性能, 而方法1寫在構(gòu)造函數(shù)中, 每創(chuàng)造一個實例都要運行一遍printName函數(shù).

//方法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);

問題13: Object.create 有什么作用?兼容性如何掺冠?

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

child = Object.create(parent.prototype)
//使child.__proro__ = parent.prototype
ES5兼容性

問題14: hasOwnProperty有什么作用? 如何使用德崭?

hasOwnPerperty是Object.prototype的一個方法斥黑,可以判斷一個對象是否包含自定義屬性而不是原型鏈上的屬性
hasOwnProperty是JavaScript中唯一一個處理屬性但是不查找原型鏈的函數(shù)

obj.hasOwnProperty(prop)
//prop : 要檢查的屬性名
//obj: 要檢查的對象
//返回一個布爾值

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

function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
function Male(name, sex, age){
    //運行構(gòu)造函數(shù),把屬性賦值到自己內(nèi)部
    Person.call(this, name, sex);    //call主要是為了把環(huán)境改到自己的作用域內(nèi)
    this.age = age;
}

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

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

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

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

function inherit(superType, subType){
    subType.prototype = Object.create(superType.prototype)
    subType.prototype.constructor = subType
}
inherit(Person, Male)
Male.prototype.getAge = function(){
    console.log(this.age)
};

var ruoyu = new Male('若愚', '男', 27);
ruoyu.getName();
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末锌奴,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子憾股,更是在濱河造成了極大的恐慌鹿蜀,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,591評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件服球,死亡現(xiàn)場離奇詭異茴恰,居然都是意外死亡,警方通過查閱死者的電腦和手機斩熊,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,448評論 3 392
  • 文/潘曉璐 我一進店門往枣,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人粉渠,你說我怎么就攤上這事分冈。” “怎么了渣叛?”我有些...
    開封第一講書人閱讀 162,823評論 0 353
  • 文/不壞的土叔 我叫張陵丈秩,是天一觀的道長。 經(jīng)常有香客問我淳衙,道長蘑秽,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,204評論 1 292
  • 正文 為了忘掉前任箫攀,我火速辦了婚禮肠牲,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘靴跛。我一直安慰自己缀雳,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 67,228評論 6 388
  • 文/花漫 我一把揭開白布梢睛。 她就那樣靜靜地躺著肥印,像睡著了一般识椰。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上深碱,一...
    開封第一講書人閱讀 51,190評論 1 299
  • 那天腹鹉,我揣著相機與錄音,去河邊找鬼敷硅。 笑死功咒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的绞蹦。 我是一名探鬼主播力奋,決...
    沈念sama閱讀 40,078評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼幽七!你這毒婦竟也來了景殷?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,923評論 0 274
  • 序言:老撾萬榮一對情侶失蹤锉走,失蹤者是張志新(化名)和其女友劉穎滨彻,沒想到半個月后藕届,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體挪蹭,經(jīng)...
    沈念sama閱讀 45,334評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,550評論 2 333
  • 正文 我和宋清朗相戀三年休偶,在試婚紗的時候發(fā)現(xiàn)自己被綠了梁厉。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,727評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡踏兜,死狀恐怖词顾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情碱妆,我是刑警寧澤肉盹,帶...
    沈念sama閱讀 35,428評論 5 343
  • 正文 年R本政府宣布,位于F島的核電站疹尾,受9級特大地震影響上忍,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜纳本,卻給世界環(huán)境...
    茶點故事閱讀 41,022評論 3 326
  • 文/蒙蒙 一窍蓝、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧繁成,春花似錦吓笙、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,672評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽絮蒿。三九已至,卻和暖如春叁鉴,著一層夾襖步出監(jiān)牢的瞬間歌径,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,826評論 1 269
  • 我被黑心中介騙來泰國打工亲茅, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留回铛,地道東北人。 一個月前我還...
    沈念sama閱讀 47,734評論 2 368
  • 正文 我出身青樓克锣,卻偏偏與公主長得像茵肃,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子袭祟,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,619評論 2 354

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

  • this 相關(guān)問題 問題1: apply验残、call 有什么作用,什么區(qū)別 Javascript的每個Functio...
    Maggie_77閱讀 595評論 0 0
  • 一巾乳、this 相關(guān)問題 知乎上關(guān)于this的解答 this 的值到底是什么您没?一次說清楚 this 的工作原理在js...
    66dong66閱讀 552評論 0 0
  • 1: apply、call 胆绊、bind有什么作用氨鹏,什么區(qū)別 call 和 apply 都是為了改變某個函數(shù)運行時的...
    高進哥哥閱讀 256評論 0 0
  • this 問題1: apply、call 压状、bind有什么作用仆抵,什么區(qū)別 call 和 apply 都是為了改變某...
    好奇而已閱讀 314評論 0 0
  • 1. apply、call 种冬、bind有什么作用镣丑,什么區(qū)別? call ,apply的作用:調(diào)用一個函數(shù)娱两,傳入函數(shù)...
    Rising_suns閱讀 395評論 0 0