JavaScript学习(1)——prototype原型和作用域

        很久没有写博客了,但是学习的过程总得写些什么记录下来。好记性不如烂笔头,其实说的是要把学习过程记录一下,这个记录的过程就是自己思考消化吸收的过程。所以还是要写一写的。所以文章中的文字都是自己一一敲字敲下来的,都是自己理解的内容,各位酌情观看。

        首先看了很多篇文章,直到看到这个【深入理解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找到了,就可以执行而不报错。

盗图...
盗图...

总结:实例对象自动具有__proto__属性对象,函数自动具有prototype属性对象;实例的__proto__指向构造函数的prototype原型;

        回到刚刚的回答,简单的理解:原型是指为其他对象(a、b、c)提供访问共享属性(fn1)访问的对象(A.prototype)。原型原来就这么简单!

      真这么简单吗?看个大图就知道了。

JavaScript原型链终极大法
原型链终极图

         如上文所示,JavaScript在构建函数的时候自动创建的prototype对象,那这个prototype对象也是对象,他有没有原型呢?他的原型是谁?且听下回分解

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值