回味JS(五)面向?qū)ο缶幊?/h2>

什么是對象(廣義上其他語言中的對象)?

  • 對象是單個實(shí)物的抽象
  • 對象是一個容器,封裝了屬性(property)和方法(method)

構(gòu)造函數(shù)有什么特點(diǎn)?

  • 函數(shù)體內(nèi)部使用了this關(guān)鍵字,代表了所要生成的對象實(shí)例。
  • 生成對象的時候,必須使用new命令。

new命令的原理是什么?

  1. 創(chuàng)建一個空對象
  2. 將這個空對象的原型指向構(gòu)造函數(shù)的prototype屬性
  3. 綁定this指向,即指向這個空對象
  4. 開始執(zhí)行構(gòu)造函數(shù)內(nèi)部的代碼

手動實(shí)現(xiàn)一個new:

function newObject ()  {
   var obj = new Object()              // 從Object.prototype上克隆一個空對象 
   obj.__proto__ = Constructor.prototype  // 指向構(gòu)造器的prototype
   var Constructor = [].shift.call(arguments)  
   var ret = Constructor.apply(obj, arguments)  
   return typeof ret === 'object' ? ret : obj
}

如果忘了使用new命令,直接調(diào)用構(gòu)造函數(shù)會發(fā)生什么事?

  • 這個構(gòu)造函數(shù)就變成了普通函數(shù),并不會生成實(shí)例對象
  • this這時代表全局對象

構(gòu)造函數(shù)內(nèi)部return語句有什么注意點(diǎn)?

  • 有return語句時,如果后面跟的是對象,則返回這個指定的新對象;否則,就會不管return語句,返回this對象

Object.create(null)和new object()和{}的區(qū)別?

  • 這三個都是創(chuàng)建空對象的方法
  • Object.create(null)創(chuàng)建的是一個干凈的空對象,在該對象上沒有繼承 Object.prototype 原型鏈上的屬性或者方法,例如:toString(), hasOwnProperty()等方法
  • 通過{}創(chuàng)建的對象和new Object()的方式是一樣的,都會繼承Object對象的所有屬性,new創(chuàng)建出的空對象會綁定Object的prototype原型對象
  • 使用for…in循環(huán)的時候會遍歷對象原型鏈上的屬性,使用create(null)生成的空對象不會再被檢查屬性

什么情況下使用Object.create()來生成對象?

  1. 當(dāng)你需要一個非常干凈且高度可定制的對象當(dāng)做數(shù)據(jù)字典的時候
  2. 需要自己定義hasOwnProperty、toString方法的時候

Object.create()生成對象的原理是是什么?

  1. 內(nèi)部定義一個構(gòu)造函數(shù)
  2. 將參數(shù)綁定到這個構(gòu)造函數(shù)的Prototype,
  3. 返回這個構(gòu)造函數(shù)的實(shí)例對象

內(nèi)部實(shí)現(xiàn)的代碼原理如下:

function create(o){
    function F(){}
    F.prototype = o;
    return new F();
}

this的指向?

在 ES5 中,其實(shí) this 的指向,始終堅(jiān)持一個原理: this 永遠(yuǎn)指向最后調(diào)用它的那個對象
this的指向常見于以下幾種綁定方式:

  1. 默認(rèn)綁定 (函數(shù)調(diào)用), 指向全局
  2. 隱式綁定 (方法調(diào)用), 當(dāng)函數(shù)引用有上下文對象時,this指向這個上下文對象
  3. 顯式綁定 (簡介調(diào)用), 通過call()或者apply()綁定的this
  4. new綁定 (構(gòu)造函數(shù)調(diào)用), 指向new出來的這個對象
  5. 箭頭函數(shù)綁定, 箭頭函數(shù)本身沒有this,綁定的是最近一層非箭頭函數(shù)的 this

改變this的幾個方法,call、apply、bind有什么異同?

  • call方法的第一個參數(shù)就是this所要指向的那個對象,如果參數(shù)為空、null和undefined,則默認(rèn)傳入全局對象;可以接受多個參數(shù)。
  • apply方法的作用與call方法類似,但是第二個參數(shù)為數(shù)組
  • bind方法用于將函數(shù)體內(nèi)的this綁定到某個對象,然后返回一個新函數(shù);bind與apply和call的區(qū)別就是bind不會被立即調(diào)用,它返回的是一個函數(shù)

apply() 有哪些應(yīng)用場景?

  1. 找出數(shù)組最大元素
Math.max.apply(null, array) 
  1. 將數(shù)組的空元素變?yōu)閡ndefined
Array.apply(null, ['a', ,'b'])  // [ 'a', undefined, 'b' ]
  1. 轉(zhuǎn)換類數(shù)組的對象
Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容