需知足:bash
/**
* 由於new是關鍵字,因此不能直接覆蓋。
* 咱們這邊用create來模擬實現。
*/
function create () {
let obj = {}
let Con = [].shift.call(arguments)
// 連接原型,使得新建對象能夠訪問到構造函數原型上的屬性
obj.__proto__ = Con.prototype
// 綁定this
Con.apply(obj, arguments)
return obj
}
複製代碼
構造函數返回值有以下三種狀況:app
綜上,因此須要判斷下返回的值是否是一個對象,若是是對象則返回這個對象,否則返回新建立的 obj對象。函數
/**
* 由於new是關鍵字,因此不能直接覆蓋。
* 咱們這邊用create來模擬實現。
*/
function create () {
let obj = {}
let Con = [].shift.call(arguments)
// 連接原型,使得新建對象能夠訪問到構造函數原型上的屬性
obj.__proto__ = Con.prototype
// 綁定this
let ret = Con.apply(obj, arguments)
return ret instanceof Object ? ret : obj
}
複製代碼
// 測試用例
function Car(color) {
this.color = color;
}
Car.prototype.start = function() {
console.log(this.color + " car start");
}
var car = create(Car, "black");
car.color;
// black
car.start();
// black car start
複製代碼
instanceof
運算符用來檢測 constructor.prototype
是否存在於參數 object 的原型鏈上。測試
function instanceof1 (left, right) {
// 獲取類型原型
let prototype = right.prototype
// 獲取對象原型
left = left.__proto__
// 判斷對象的類型是否等於類型的原型
while (true) {
if (left === null)
return false
if (left === prototype)
return true
left = left.__proto__
}
}
複製代碼
收工~ui