本来是想写闭包的,但是发现还是没完全理解,资料也看得一脸懵,还是退而求其次,写个原型,原型链吧,闭包的话之后再写,容我先看懂
原型,原型链,不知道现在的面试还会不会问
原型
每个构造函数都有一个prototype属性,指向函数的原型对象
每个对象都有一个_proto_属性,并且指向prototype原型对象
以下的代码你会发现
Animal.prototype === animal._proto_
Animal.prototype.constructor === Animal
function Animal(name, sex) {
this.name = name
this.sex = sex
this.sayHi = function() {
console.log('hi')
}
}
const animal = new Animal('dog', 'male')
针对原型的话,记住上面那个差不多了。
原型链
写个小栗子,以数组为例
const array = [1,2,3,4,5]
array.toString()
array.valueOf()
这两个方法,会发现我们当前定义的array并没有定义方法,所以他是怎么来的呢
首先正常先查看 array._proto_
发现toString()方法找到了,但是发现valueOf方法还是没有找到
点开下方的[[prototype]],这个是array.prototype._proto_
发现找到了valueOf
所以查询一个方法的时候,我们应该是以下操作
1. 看下当前对象是否有这个方法
2. 没有的话向上查找当前对象的__proto__,找到构造函数的原型,如果是数组的话是查询Array.prototype看是否有该属性或者方法
3. 如果还是没有,继续向上查找
最终查到Object.prototype.__proto__ === null 查找结束
以上就是原型链。
原型链的应用的话,可以拓展插件,增加全局方法等,具体情况具体实现