需知足: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