什么是對象(廣義上其他語言中的對象)?
- 對象是單個實(shí)物的抽象
- 對象是一個容器,封裝了屬性(property)和方法(method)
構(gòu)造函數(shù)有什么特點(diǎn)?
- 函數(shù)體內(nèi)部使用了this關(guān)鍵字,代表了所要生成的對象實(shí)例。
- 生成對象的時候,必須使用new命令。
new命令的原理是什么?
- 創(chuàng)建一個空對象
- 將這個空對象的原型指向構(gòu)造函數(shù)的prototype屬性
- 綁定this指向,即指向這個空對象
- 開始執(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()來生成對象?
- 當(dāng)你需要一個非常干凈且高度可定制的對象當(dāng)做數(shù)據(jù)字典的時候
- 需要自己定義hasOwnProperty、toString方法的時候
Object.create()生成對象的原理是是什么?
- 內(nèi)部定義一個構(gòu)造函數(shù)
- 將參數(shù)綁定到這個構(gòu)造函數(shù)的Prototype,
- 返回這個構(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的指向常見于以下幾種綁定方式:
- 默認(rèn)綁定 (函數(shù)調(diào)用), 指向全局
- 隱式綁定 (方法調(diào)用), 當(dāng)函數(shù)引用有上下文對象時,this指向這個上下文對象
- 顯式綁定 (簡介調(diào)用), 通過call()或者apply()綁定的this
- new綁定 (構(gòu)造函數(shù)調(diào)用), 指向new出來的這個對象
- 箭頭函數(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)用場景?
- 找出數(shù)組最大元素
Math.max.apply(null, array)
- 將數(shù)組的空元素變?yōu)閡ndefined
Array.apply(null, ['a', ,'b']) // [ 'a', undefined, 'b' ]
- 轉(zhuǎn)換類數(shù)組的對象
Array.prototype.slice.apply({0: 1, length: 2}) // [1, undefined]