很久没有写博客了,但是学习的过程总得写些什么记录下来。好记性不如烂笔头,其实说的是要把学习过程记录一下,这个记录的过程就是自己思考消化吸收的过程。所以还是要写一写的。所以文章中的文字都是自己一一敲字敲下来的,都是自己理解的内容,各位酌情观看。
首先看了很多篇文章,直到看到这个【深入理解JavaScript原型和闭包】,是一个系列,每篇都短小通俗易懂。才有一种豁然开朗的感觉。接着又看到了这篇【JavaScript闭包的底层运行机制】,都是好文,建议先读。
那么什么是JavaScript的原型呢?
1.JavaScript原型
如果有面试官问到你什么是JavaScript原型,该怎么回答。有个总结是这么说的:原型是指为其它对象提供共享属性访问的对象。在创建对象时,每个对象都包含一个隐式引用指向它的原型对象或者 null。
这里解释一下,主要是“对象”的迷糊导致了理解不清。JavaScript最重要的数据类型,除了普通的字符串、undefined、null、数字(...等),其他都都是对象。而函数是JavaScript对象的一等公民(first-class objects),JavaScript在创建对象的时候先通过函数(称他为A)这个对象来生成实例(称他为a)。构建函数的方法论(函数继承方法)有很多种,在设计JavaScript的时候,怎么让子类更好的继承父类呢,js在这里使用了prototype。看这个例子
var A = function (){
//code
};
A.prototype.fun1=funciton (){
console.log("funciton 1");
}
var a = new A();
var b = new A();
var c = new A();
这里A是函数,JavaScript自动让它具有prototype属性,而且这个prototype属性的值指向的也是个对象,默认的只有一个叫做constructor的属性,指向这个函数本身。先不用理解这么多,总之:JavaScript代码的函数会自动创建出函数的一个原型prototype,而且这个原型是个对象。
通过new 方法,构建了实例a,JavaScript会自动给a对象(实例)隐式添加__proto__属性,这个属性指向了创建a实例的函数的原型prototype,也就是a.__proto__=A.prototype。JavaScript还赋予对象一种功能——对象当前没有找到的属性会在原型上寻找,也就是继承的概念。这里a.fun1()从A.prototype找到了,就可以执行而不报错。
![盗图...](https://img-blog.csdnimg.cn/144e6faee7e14027ad685d990ab6f932.png)
总结:实例对象自动具有__proto__属性对象,函数自动具有prototype属性对象;实例的__proto__指向构造函数的prototype原型;
回到刚刚的回答,简单的理解:原型是指为其他对象(a、b、c)提供访问共享属性(fn1)访问的对象(A.prototype)。原型原来就这么简单!
真这么简单吗?看个大图就知道了。
![JavaScript原型链终极大法](https://img-blog.csdnimg.cn/2ef0dcc87cec44d99727b7ab28b58ec1.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBANzJkZWdyZWVz,size_15,color_FFFFFF,t_70,g_se,x_16)
如上文所示,JavaScript在构建函数的时候自动创建的prototype对象,那这个prototype对象也是对象,他有没有原型呢?他的原型是谁?且听下回分解。