JS学习——原型链的理解

先引入一段简单的代码

		function Fn(){
			this.test1=function(){
				console.log("test1()");
			}
		}
		Fn.prototype.test2=function(){
			console.log("test2()");
		}
		var fn=new Fn();
		fn.test1();
		fn.test2();

根据我们对原型对象和显示、隐形原型对象的知识,我们可以画一个简易草图,来理解他们之间的关系。

test1()和test2()明显都可以被执行,这是没得说的,实例对象fn中没有test2()方法,就会顺着箭头到达原型对象,找到并执行方法。

这里,我们新添加一行新的代码并运行。

console.log(fn.toString());

在浏览器输出栏查看结果,如下

真的有输出结果,可并没有为Fn函数对象,Fn原型定义任何toString()方法,是怎么执行成功的呢?

这是因为,Fn的原型对象,在创建之初就是一个Object空对象,是我们后期往里边添加了其他方法,既然是空对象,那就是一个实例对象,我们学过隐形原型,既然是实例对象 ->就会拥有隐式原型属性,按我的话理解,Fn的原型对象指向了自己的"原型对象",即Object原型对象,但这个原型对象中,已经有了toString()方法,所以我们执行成功了,有一点绕,我们画图理解。

我们知道,构造函数的prototype属性,和其实例对象的隐式原型属性__proto__属性是相等的,固他们的地址值相等。

我们测试一下,一辨真假,运行如下代码,并 在浏览器端打开

console.log(Object.prototype);

在这个"Object原型对象中",我们发现了想要的toString()方法,甚至还有其他很多的方法,也拥有自己的constructor属性。

咱们并没有定义这个function Object()呀?他是怎么出现的,在我们加载网页,早在定义自己的函数Fn1之前,Object就已经存在啦,这就解释的通了。专业点来说,JS引擎会先预加载一些内置函数。

这跟我们的原型链有什么关系呢?非常有关系,我们将实例对象fn也表现在图上,如下

当我们调用某个实例对象的属性,他会现在自身查找,所以我们调用test1()成功了,当自身查找不到时,就会顺着箭头到其原型对象中找,所以我们调用test2()成功了,如果在原型对象中也找不到,就会根据原型对象的隐式原型属性,到达Object原型对象,在其中查找。这就是我所理解的原型链知识了。

 

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值