new 关键字
在了解 new 关键字时我们要先知道 new 是拿来干什么的, new 关键字用来创建一个对象, 他后面的函数称为构造函数, 并约定首字母大写, 在创建对象的时候真正起作用的是 new 关键字, 并不是后面的函数, 后面的函数就是一个普通的函数。
new 做了什么:
- 创建一个空对象
- 给这个对象绑定一个隐式属性 [[proto]] , 这个属性指向原型对象
- 将 this 指向这个空对象
- 执行函数
- 返回引用
注意:如果返回值是基本数据类型, 那么 this 就执向这个创建的实例, 但是如果返回的是其他引用数据类型,那么实例指向这个引用数据
function myNew (fn, ...args) {
// 创建一个新的对象
const emptyObj = Object.create(null)
// 给这个对象绑定一个隐式属性 __proto__ 指向构造函数的显示原型
emptyObj.__proto__ = fn.prototype
// 将 this 指向这个空对象
this = emptyObj
// 执行函数
fn.apply(this, ...args)
// 返回引用
return this
}
以上是对 new 的一个简单实现, 主要目的是为了搞清楚他是怎么运转的
instanceOf
instanceOf 的作用是判断表达式左边的参数是否在表达式右边的原型链上, 他是按照原型链的查找机制进行查找的, 我们知道原型链的本质就是对象的隐式原型和显示原型的连接关系, 我们沿着原型链查找就可以得到答案
function myInstanceOf (leftParams, rightParams) {
// 拿到左边参数的隐式原型
let proto = leftParams.__proto__
// 当 proto 不为空的时候, 对他进行遍历
while (proto !== null) {
if (proto === rightParams.prototype) {
return true
}
// 这里有个知识点 obj.__proto__ === Object.prototype, Object.prototype.__proto__ === null
proto = proro.__proto__ // 这一步是, 如果不满足条件,就让他一步一步往上查找
}
return false
}