31.this鹏倘,原型鏈纤泵,繼承

一. this

參考
1.深入淺出妙用 Javascript 中 apply捏题、call涉馅、bind
2.理解 JavaScript 中的 Function.prototype.bind
3.this 關(guān)鍵字

1. apply、call 捻浦、bind有什么作用朱灿,什么區(qū)別
  • 作用:三者都可以固定this的值盗扒,避免出現(xiàn)意想不到的情況
    • fun.call(thisArg[, arg1[, arg2[, ...]]])
      call() 方法調(diào)用一個函數(shù), 其具有一個指定的this值和分別地提供的參數(shù)(參數(shù)的列表)
    • fun.apply(thisArg, [argsArray])
      apply方法的作用與call方法類似侣灶,也是改變this指向褥影,然后再調(diào)用該函數(shù)凡怎。唯一的區(qū)別就是统倒,它接收一個數(shù)組或類數(shù)組對象作為函數(shù)執(zhí)行時的參數(shù)
    • fun.bind(thisArg[, arg1[, arg2[, ...]]])
      創(chuàng)建了一個函數(shù)房匆,當(dāng)這個函數(shù)在被調(diào)用的時候墓猎,它的 this 會被設(shè)置成被傳入第一個值毙沾。
  • 區(qū)別:

1.apply/callbind
bind改變了this值后沒有立即執(zhí)行左胞,而apply和call都是立即執(zhí)行的

var obj = {
  a:1
}

var foo = {
  getA: function(){
    console.log(this.a)
  }
}

foo.getA()  //undefined
foo.getA.bind(obj)()  //1
foo.getA.call(obj)  //1
foo.getA.apply(obj)  //1

2.applycall
apply的第二個參數(shù)是數(shù)組或類數(shù)組對象烤宙,call接受的則是若干個參數(shù)

var arr = [1,2,3,4,9]
console.log(Math.max.apply(Math,arr))  //9
console.log(Math.max.call(Math,1,2,3,4,9))//9
2.以下代碼輸出?
var john = { 
  firstName: "John" 
}
function func() { 
  alert(this.firstName + ": hi!")
}
john.sayHi = func  //john對象添加sayHi方法,方法為func
john.sayHi()  //"John: hi!"   執(zhí)行,此時this為john
3.以下代碼輸出?
func()  //[object Window] 全局作用域下函數(shù)拐云,this綁定為全局對象
function func() { 
  alert(this)
}

4.以下代碼輸出?
document.addEventListener('click', function(e){
    console.log(this);   //document 在事件處理程序中this代表事件源對象
    setTimeout(function(){
        console.log(this); //window setTimeout函數(shù)始終是在全局作用域下調(diào)用的叉瘩,所以this在非嚴(yán)格模式下指向window
    }, 200);
}, false);

5.以下代碼輸出?
var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john)  
//John  call方法將func的this指定為john對象薇缅,所以this.firstName就是"John"了
6.以下代碼有什么問題泳桦,如何修改
var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this) //this指什么$btn而并非module蓬痒,不能調(diào)用module下的showMsg方法
      this.showMsg();
    })
  },
  
  showMsg: function(){
    console.log('沒什么');
  }
}

//修改
var module= {
  bind: function(){
    $btn.on('click', function(){
      console.log(this)
      this.showMsg();
    }.bind(this))
  },
  
  showMsg: function(){
    console.log('沒什么');
  }
}

二.原型鏈
1.有如下代碼,解釋Person演痒、 prototype惦蚊、proto、p兆沙、constructor之間的關(guān)聯(lián)葛圃。
function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log('My name is :' + this.name);
}
var p = new Person("haha")
p.sayName();
//1.定義Person構(gòu)造函數(shù)库正,Person構(gòu)造函數(shù)自帶prototype屬性
//2.prototype屬性中有constructor屬性褥符,指向構(gòu)造函數(shù)
//3.每個構(gòu)造函數(shù)的實例都有__proto__屬性喷楣,指向構(gòu)造函數(shù)的prototype屬性
2.上例中抡蛙,對對象 p可以這樣調(diào)用 p.toString()。toString是哪里來的? 畫出原型圖?并解釋什么是原型鏈捣炬。
Person不完全原型圖

如圖示,Person構(gòu)造函數(shù)中沒有toString()方法灭美,所以繼續(xù)在其原型中查找届腐,也沒有犁苏,所以Person.prototype的原型围详,即Object.prototype中查找,然后找到了對象原型中的toString()方法

對象的屬性和方法袁勺,有可能是定義在自身期丰,也有可能是定義在它的原型對象咐汞。由于原型本身也是對象化撕,又有自己的原型植阴,所以形成了一條原型鏈(prototype chain)原文鏈接

3.對String做擴(kuò)展掠手,實現(xiàn)如下方式獲取字符串中頻率最高的字符
String.prototype.getMostOften = function(){
  var i, obj = {}
  var textSplit = this.split('')
  for(i= 0; i<this.length; i++){
    if(textSplit[i] in obj){
      obj[textSplit[i]]+=1
    }else{
      obj[textSplit[i]]=1
    }
  }
  var index=0,max
  for(key in obj){
    if(obj[key] > index){
      max = key
      index = obj[key]
    }
  }
  return max
}

var str = 'ahbbccdeddddfg';
var ch = str.getMostOften();
console.log(ch); //d , 因為d 出現(xiàn)了5次
4.instanceof有什么作用?內(nèi)部邏輯是如何實現(xiàn)的灸拍?
  • instanceof判斷對象是否為某個構(gòu)造函數(shù)的實例混槐;
  • 內(nèi)部邏輯:判斷構(gòu)造函數(shù)的原型是否在對象的原型鏈上声登,在就返回true悯嗓,反之false
//例
function Person(name){
    this.name = name;
}
Person.prototype.sayName = function(){
    console.log('My name is :' + this.name);
}
var p = new Person("haha")

console.log(p instanceof Person)  //true
console.log(p instanceof Object)  //true
三.繼承
1.繼承有什么作用?

繼承是指一個對象可以直接使用另一個對象的屬性和方法绅作,繼承提高了代碼復(fù)用性俄认,減少重復(fù)勞動

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

方法1的實例之間屬性和方法都是獨立的眯杏,共用的屬性和方法不能共享岂贩,同時也浪費資源
方法2的實例之間printName方法是共享的

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

3.Object.create 有什么作用萎津?兼容性如何锉屈?

Object.create(proto, [ propertiesObject ]):創(chuàng)建一個對象颈渊,使其原型為傳入的第一個參數(shù)
兼容性:IE 9+

4.hasOwnProperty有什么作用俊嗽? 如何使用绍豁?

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

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

Person.prototype.printName = function(){
    console.log(this.name);
}
var p1 = new Person('小明', 27);
console.log(p1.hasOwnProperty('printSex'))  //true
console.log(p1.hasOwnProperty('printName'))  //false
5.如下代碼中call的作用是什么?
function Person(name, sex){
    this.name = name;
    this.sex = sex;
}
function Male(name, sex, age){
    Person.call(this, name, sex);    //這里的call 用于繼承Person的屬性
    this.age = age;
}
//在實例化后male里面就可以獲取到name,sex屬性
var male1 = new Male('xiaoming','男',12)
console.log(male1.name,male1.sex,male1.age) //xiaoming 男 12

6.補全代碼晌纫,實現(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.bind(this)(name,sex)
   this.age = age
}

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

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

var ruoyu = new Male('ruoyu', '男', 27);
ruoyu.getName();//ruoyu
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市哥牍,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌撼泛,老刑警劉巖愿题,帶你破解...
    沈念sama閱讀 206,968評論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異雁仲,居然都是意外死亡伯顶,警方通過查閱死者的電腦和手機祭衩,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,601評論 2 382
  • 文/潘曉璐 我一進(jìn)店門蝎抽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來樟结,“玉大人瓢宦,你說我怎么就攤上這事驮履×溃” “怎么了怠噪?”我有些...
    開封第一講書人閱讀 153,220評論 0 344
  • 文/不壞的土叔 我叫張陵矫夷,是天一觀的道長。 經(jīng)常有香客問我孵运,道長治笨,這世上最難降的妖魔是什么旷赖? 我笑而不...
    開封第一講書人閱讀 55,416評論 1 279
  • 正文 為了忘掉前任,我火速辦了婚禮蹂空,結(jié)果婚禮上上枕,老公的妹妹穿的比我還像新娘辨萍。我一直安慰自己锈玉,他們只是感情好拉背,可當(dāng)我...
    茶點故事閱讀 64,425評論 5 374
  • 文/花漫 我一把揭開白布抡诞。 她就那樣靜靜地躺著,像睡著了一般肴熏。 火紅的嫁衣襯著肌膚如雪蛙吏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,144評論 1 285
  • 那天谓着,我揣著相機與錄音赊锚,去河邊找鬼舷蒲。 笑死牲平,一個胖子當(dāng)著我的面吹牛纵柿,可吹牛的內(nèi)容都是我干的昂儒。 我是一名探鬼主播荆忍,決...
    沈念sama閱讀 38,432評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼刹枉,長吁一口氣:“原來是場噩夢啊……” “哼微宝!你這毒婦竟也來了蟋软?” 一聲冷哼從身側(cè)響起岳守,我...
    開封第一講書人閱讀 37,088評論 0 261
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后拒逮,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滩援,經(jīng)...
    沈念sama閱讀 43,586評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,028評論 2 325
  • 正文 我和宋清朗相戀三年佣赖,在試婚紗的時候發(fā)現(xiàn)自己被綠了憎蛤。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片俩檬。...
    茶點故事閱讀 38,137評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡棚辽,死狀恐怖屈藐,靈堂內(nèi)的尸體忽然破棺而出联逻,到底是詐尸還是另有隱情包归,我是刑警寧澤公壤,帶...
    沈念sama閱讀 33,783評論 4 324
  • 正文 年R本政府宣布厦幅,位于F島的核電站确憨,受9級特大地震影響缚态,放射性物質(zhì)發(fā)生泄漏玫芦。R本人自食惡果不足惜桥帆,卻給世界環(huán)境...
    茶點故事閱讀 39,343評論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望茫多。 院中可真熱鬧天揖,春花似錦、人聲如沸些阅。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,333評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽弓千。三九已至洋访,卻和暖如春姻政,著一層夾襖步出監(jiān)牢的瞬間汁展,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,559評論 1 262
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留器紧,地道東北人铲汪。 一個月前我還...
    沈念sama閱讀 45,595評論 2 355
  • 正文 我出身青樓狰住,卻偏偏與公主長得像催植,于是被迫代替她去往敵國和親士飒。 傳聞我的和親對象是個殘疾皇子酵幕,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,901評論 2 345

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

  • 1: apply邓深、call 芥备、bind有什么作用萌壳,什么區(qū)別 call 和 apply 都是為了改變某個函數(shù)運行時的...
    高進(jìn)哥哥閱讀 248評論 0 0
  • 1. apply袱瓮、call 尺借、bind有什么作用燎斩,什么區(qū)別? call ,apply的作用:調(diào)用一個函數(shù)笋鄙,傳入函數(shù)...
    Rising_suns閱讀 385評論 0 0
  • 1:apply局装、call 、bind有什么作用拨脉,什么區(qū)別 call 和 apply 都是為了改變某個函數(shù)運行時的上...
  • 博客內(nèi)容:什么是面向?qū)ο鬄槭裁匆嫦驅(qū)ο竺嫦驅(qū)ο缶幊痰奶匦院驮瓌t理解對象屬性創(chuàng)建對象繼承 什么是面向?qū)ο?面向?qū)ο?..
    _Dot912閱讀 1,401評論 3 12
  • 煙臺的天氣,悶悶的帖旨,好不難受解阅。潮濕的心情在狹小的宿舍里悶得有股霉味,壓抑而彷徨述召。城市的吵鬧讓人無法靜心积暖,只想靜靜地...
    魑魅魍魎1996閱讀 208評論 0 0