好巧不巧最近萌生了一点离职想法就把以前的一些面试拿出来看看,一下就发现了原型和原型链这个以前面试基本上必问的问题
以前也是靠死记硬背没有正正去了解原型和原型链到底是干啥用的,正所谓你不懂一个东西你就很难去驾驭它使用它,果然到现在浑浑噩噩工作了三年也是很少用到 桑心
今天刚好是看到了这个面试题,所以也并不打算放过它,直接当场生吃活剥了它 ()
废话不多说开撸
每个对象、函数都有prototype原型属性我们在使用一些公共的函数方法时候可以挂载在我们的原型上 节省性能
大白话口述一下吧 原型链和原型
每个对象、函数都有一个prototype原型而这个是个对象,
每个对象、函数都有一个prototype原型,原型自身还有原型这就形成了原型链条,当我们使用对象方法的时候他首先会从自身开始寻找这个方法找不到就在prototype里面寻找 。
函数原型的自身还有一个prototype属性是函数原型的原型,也是这个原型链的终点
为啥说是原型链的终点呢,举个栗子
function fun(num){
this.num = num
}
fun.prototype.prototype === Object.prototype // 输出 true 表示他同步Object.prototype
Object.prototype.prototype // 输出undefined 表示这个原型链已经到头鸟
那我们看一下fun.prototype里面有些啥,输出打印看了一下
可以看到函数fn的第一层原型只有constructor 和 __proto__属性 而proto就是prototype
我们现在可以用
let obj = new fun(15)
obj.num.toString() // 已经转换成字符串 我们可以看上面的图输出第一层并没有toString 方法而是在原型的__proto__ 里面有,这就验证了我们的说法 他会一层一层在原型上面寻找这个函数
可是突然一想我们之前说的只有 对象和函数才有prototype属性啊
那为什么我们平常用的基本数据类型
let num = 6
num.toString() // 也可以转换成功
我也是出于不解百度搜一下得出答案:
大意即指,当基本数据类型(boolean,Number、String)在调用方法时,JS 将会创建对象,以便调用方法属性,而在使用完毕后将会销毁该对象。
目前刚有些浅认识先记录后面有深理解在来补充 !!!
也算是懂了每个对象方法数组方法的背后都有一层层逻辑在运行支撑,
我们应以谦卑的姿态才能更好的站在巨人的肩膀上编程