JS的原型
js默认会通过__proto__和prototype形成一条原型链,对象的属性和方法的查找会通过这原型链一直查到object;
一、js中的对象
1、对应java中的类
js中没有类的概念,但是有函数的概念,所以可以直接定义一个函数,并把它作为构造函数,由于new关键字就是new构造函数的,所以我们也可以用new关键字来实例一个js函数的对象出来;
2、对应java中的成员变量和成员方法
但是类中是有成员变量和成员方法的,我们在js的构造函数中无法再添加一个函数作为成员方法,那怎么办?
我们给构造函数添加一个属性叫prototype,在这个属性上,我们再去给它添加变量和函数,并且初始化一个构造函数的实例的时候,会自动把这个prototype属性上的变量和函数变成实例可以调用的属性和方法;
3、_ _protto_ _是干什么的?
刚刚我们说了,初始化一个构造函数的实例时,prototype上的变量和函数会自动变成实例的属性和方法,这个是怎么做到的呢?
其实就是靠的_ _protto_ _;
当js的实例想调用属性和方法时,它会去_ _protto_ _查找,而实例的_ _protto_ _指向的就是父类的prototype属性,或者说指向的就是构造函数的prototype属性;
如果你访问的属性在父类.prototype
也不存在,那又会继续往父类.prototype.__proto__
上找,这时候其实就找到了Object
了,Object
再往上找就没有了,也就是null,这其实就是原型链。
prototype
是函数的属性,不是对象的, 对象拥有的是__proto__
,是用来查找prototype
的。
4、什么是构造函数的prototype.constructor属性?
构造函数的prototype.constructor属性就还是构造函数它本身,并且修改构造函数的prototype.constructor属性到其他函数并没用,它始终执行构造函数本身;
5、图解上述关系
二、静态方法
三、继承
对象拥有的是__proto__
,是用来查找prototype
的。
实例对象的__proto__查找的是类的prototype属性;
prototype对象的__proto__查找的是父级prototype;
js默认会通过__proto__和prototype形成一条原型链,对象的属性和方法的查找会通过这原型链一直查到object;
参考:
https://mp.weixin.qq.com/s?__biz=MzAxODE4MTEzMA==&mid=2650090630&idx=1&sn=4022a5f5011366d3f6d06008d3340cf2&chksm=83dbb1e3b4ac38f5cd4be3fdb5208502d9a40136ab4c1f2e0162415a0bc4a583c94448480934&mpshare=1&scene=1&srcid=06299qMuMqTsvNSq8ctXEGYJ&sharer_sharetime=1624938761452&sharer_shareid=8ccb4c953286a0933eebdd160318031d&key=11d155784951b2b247eb8020e4212c63143ef87dd1c623bf9e6c1f9652529b5602fb7e68aa24074d44d28179d8f67668eebe4e3669b6c4c253874de91bcb8aaee6a34b8fdc07f401b537e6068c80b5308e21089eaafdc42ca59aacc833a4a6b746a9432db4eee5517e4d73d80fa9d6ffe8e4b1d164a8e5ac72ffb27875cd683c&ascene=1&uin=MzYzNDY0MDI3OA%3D%3D&devicetype=Windows+10+x64&version=62090529&lang=zh_CN&exportkey=A1f4zSHBNwcTrtTB9zXxUXA%3D&pass_ticket=2Ne2l%2FVDxdb5FjuRKqILdlV4mlLBe99PqlJVICgjcDr8V5XqaM8uz5p%2BVfYSzGVL&wx_header=0
原文:https://www.cnblogs.com/EricShen/p/14949605.html