this_原型鏈_繼承

this

apply、call 、bind有什么作用,什么區別?

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

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

  • bind()方法創建一個新的函數, 當被調用時,將其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為執行上下文,當一個函數作為對象的方法調用時,this默認指向這個對象

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

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

下面代碼輸出什么?

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

下面代碼輸出什么,why?

var john = { 
  firstName: "John" 
}

function func() { 
  alert( this.firstName )
}
func.call(john) // Jojn
// call方法用于在函數運行時指定this指,因此執行以上代碼時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之間的關聯。

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做擴展,實現如下方式獲取字符串中頻率最高的字符

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有什么作用?內部邏輯是如何實現的?

  • instanceof用于判斷一個對象的類型,那么它的判斷規則是什么?
    • Instanceof運算符的第一個變量一般是一個對象,暫時稱為A;第二個變量一般是一個函數,暫時稱為B。
    • Instanceof的判斷規則是:沿著A的__proto__這條線來找,同時沿著B的prototype這條線來找,如果兩條線能找到同一個引用,即同一個對象,那么就返回true。如果找到終點還未重合,則返回false。

繼承

繼承有什么作用?

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

下面兩種寫法有什么區別?

//方法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方法,
使用方法2構造的每個對象調用printName方法時都是調用的Person.prototype.printName方法
方法2大大節省了內存

Object.create 有什么作用?兼容性如何?

  • Object.create() 方法會使用指定的原型對象及其屬性去創建一個新的對象。兼容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變為Male函數的this,用此方法可實現對Person實例屬性的繼承
    this.age = age;
}

補全代碼,實現繼承

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();
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,702評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,143評論 3 415
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 175,553評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,620評論 1 307
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,416評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,940評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,024評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,170評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,709評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,597評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,784評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,291評論 5 357
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,029評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,407評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,663評論 1 280
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,403評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,746評論 2 370

推薦閱讀更多精彩內容