js中的闭包及原型

js重点及难点


前言:
转眼间,实习又一周过去了,这一周给我的感觉就是很累,但是收获也是不少的,至少能与付出成正比。自己要学的东西还有很多的,在学校学的东西跟在公司学的还是有很大的区别的,而且从学校出来进入公司学习,在学习上的习惯要有改变,以前在学校学习都是以老师教课为主,自己再回去巩固巩固,而进入公司以后就不一样了,自己要有自己的一套学习方法。在公司主要靠自己自学并且在实践中去应用所学到的知识,所以要懂得一周下来去反思去总结这一周究竟学到了什么,自己又掌握了多少。下面就是我这一周遇到比较棘手的问题:

  1. javascript闭包问题,下面是我个人的理解:
    首先什么叫闭包?
    能够访问其他函数作用域内变量的函数都叫闭包。举个例子:
   //函数A
   function A(){
        var a=2;
        //函数B
        function B(){
        //在函数B里面可以访问函数A里的变量a
        console.log(a);
        }
    }

下面我们来分析一下为什么?
1.当函数A定义时,A的作用域链中存放着当前环境下的变量,也就是GO(Global object)。
2.当函数A函数执行时会产生一个运行时上下文,此时A的作用域链的顶端会存放这个运行时上下文,也就是AO(运行时上下文),所以,GO就会顶端被挤到第二行。
3.这时候执行A的时候遇到了B函数的定义,B的作用链会直接拿到A的劳动成果。
4.当B函数执行时,B的作用域链顶端也会生成自己的运行时上下文,自然而然拿到的A函数的劳动成果只能往下排,但是当B函数执行时访问变量的访问顺序是自顶而下的,先从自己的执行期上下文里找,找不到就顺着A的AO里找。。。所以当然就能访问到函数A的变量。

2.第二个问题也是比较难理解的javascript中的原型问题:

还是先解释一下:当一个类定义时,它就有原型对象(prototype object),原型对象必须有多个内部特定属性来表示类的特性。

/*这是一个构造函数,构造函数与一般函数形式一样,只是构造函数可以new一个对象
一般构造函数我们习惯用驼峰式命名*/
function Person(name,age){
    this.name=name;
    this.age=age;
}
//定义一个对象表示中国人
var Chinese={}
//将Person的原型指向chinese
Person.prototype=Chinese;

在创建类的实例时,该实例隐式包含有对自身原型对象的引用,因此实例中也包含有[Prototype]属性。一个类的所有属性都定义在原型对象上面,当类的实例访问一个属性时,javascript解释引擎就会去原型对象上查找属性,然后执行。

例:

function GrandFather(){
   this.g1="";
   this.g2="";
}
function Father(){
   this.p3="";
   this.p4="";
}
function Child(){
   this.C5="";
}

Father.prototype=new GrandFather();
Child.prototype=new Father();

那么在实例化GrandFather时,这个实例隐式包含有自身内部属性[Prototype]的值,该值包含有GrandFather类属性的描述;同样在实例化Father时,这个实例隐式包含有自身内部属性[Prototype]的值,该值包含有Father类属性的描述;在实例化Child时,该实例包含有自身内部属性[Prototype]的值,该值包含有Child类属性的描述。

如果Child的实例调用一个属性时,那么就会按照下面的步骤:

(1)首先查找Child是否存在指定属性,如果存在就执行,如果不存在就查找该实例包含的自身内部属性[Prototype]的值,查到原型对象是Father实例,执行下一步。

(2)查到Father是否存在指定属性,如果存在,就执行该属性,如果不存在,就查找该实例包含的内部属性[Prototype]的值,查到原型对象是GrandFather实例,执行下一步。

(3)查找GrandFather是否存在指定属性,如果存在就执行,如果不存在,就查找该实例包含的内部属性[Prototype]的值,查到原型对象是Object实例,执行下一步。

(4)查找Object是否存在该属性,如果存在就执行,如果不存在,就会返回undefined,因为Object就是原型链的尽头。

因为方法就是类型为function的属性,因此,这一过程,同样适用于方法。

3.javascript中继承的方法:

             1⃣️原型链 
             2⃣️两个构造函数同时使用一个原型 
             3⃣️圣杯模式(使用一个中间构造函数)

用的比较多的就是第三种实现方式。

上面就是遇到的比较难理解的点,除此之外这一周还复习了Java方面的内部类,集合框架以及线程并发等知识点。前端方面,自己也跟着官方文档以网上视频学习了bootstrap框架以及handlebars的模版,有了官方的帮助文档,学起来还是比较简单的,所以说只要自己愿意下功夫还是能学到很多东西的。接下来的时间里,继续加油吧!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值