美文网首页
js面向对象(1)

js面向对象(1)

作者: 悟空你又瘦了 | 来源:发表于2018-01-31 10:10 被阅读0次

    1.什么是原型链

    当一个对象在查找一个属性的时,
    自身没有,就会根据__proto__ 向它的原型进行查找,如果都没有,则向它的原型的原型继续查找,直到查到
    Object.prototype._proto_为 nul,这样也就形成了原型链。
    

    2.什么是作用域链

    变量起作用的范围,就是变量的作用域
    注意:在JS当中,有且只有函数可以创建作用域!!
    
    在寻找变量的时候,在当前作用域中进行查找,如果找到了就使用,如果没有找到,就继续向上一级作用域中进
    行查找,如果找到了就使用,如果还没有找到,就继续沿着作用域链向上查找,直到全局作用域
    

    3.什么是闭包

    闭包是一个封闭的隔离的空间,在js中表现为函数所构成的外部无法访问的区域,当函数被外部引用时,就创建了该函数的闭包 
        闭包的实质是一个函数,是一个用于返回局部变量值的函数,因为在全局中,受JavaScript链式作
    用域结构的影响,父级变量中无法访问到子级的变量值,为了解决这个问题,才使用闭包这个概念。
    闭包的特性:
    ①.封闭性:外界无法访问闭包内部的数据,如果在闭包内声明变量,外界是无法访问的,除非闭包主动向外界提供访问接口;
    ②.持久性:一般的函数,调用完毕之后,系统自动注销函数,而对于闭包来说,在外部函数被调用之后,闭包结构依然保存在
    系统中,闭包中的数据依然存在,从而实现对数据的持久使用。
    优点:
    ① 减少全局变量。
    ② 减少传递函数的参数量
    ③ 封装;
       缺点:
     使用闭包会占有内存资源,过多的使用闭包会导致内存泄露等.
    
    //获得闭包中多个数据
     function foo(){
         var num1 = 1;
         var num2 = 2;
         return {
            get_num1: function(){
                return num1;
            },
            get_num2:function(){
                return num2;
            },
            set_num1:function(value){
                num1 = value;
            }
         }
      }
    var p = foo();
    console.log(p.get_num1())  --1
    console.log(p.get_num2())  --2
    p.set_num1(5)
    console.log(p.get_num1())  --5
    
    //沙箱模式
    沙箱模式就是立即执行函数表达式也叫自调用匿名函数
    特点是没有函数名,在页面加载完成时就执行一次,且内部的变量不会被外界访问到,正好符合沙箱模式
     1.   //jq写法
        (function () {
            var Cat = {
                eat:function () {
                    console.log("吃");
                }
            }
            window.cat = window.$ = Cat;
        })()
    
        window.cat.eat();//吃
        window.$.eat();//吃
        cat.eat();//吃
        $.eat();//吃
    
    2.
    <script>
        //普通模式1
        var num1 = 0;
        for(var i = 1;i <= 100; i++)
        {
            num1 += i;
        }
        console.log(num1);//5050
    
        //普通模式2
        function test() {
            var num2 = 0;
            for(var i = 1;i <= 100; i++)
            {
                num2 += i;
            }
            console.log(num2);//5050
        }
        test();
    
        //沙箱模式
        (function () {
            var num3 = 0;
            for(var i = 1;i <= 100; i++)
            {
                num3 += i;
            }
            console.log(num3);//5050
        })();
    
        console.log(num1);//还可以打印5050
        console.log(num2);//爆红,num2 is not defined ----说明函数里面的内容外面那不到
        console.log(num3);//爆红,num3 is not defined ----说明沙箱里面的内容外面那不到
    </script>
    
    3.闭包来缓存
    对象无法判断数据存储的顺序,需要用一个数组来帮助完成容量限制的操作
    数组中存储数据的键,可以根据键的数量来判断容量是否超了   
    在超容之后,可以通过键的顺序知道哪个数据是最先加进来的,然后将其删除
         function createCache(){
                    var cache = {};
                    var keys = [];
                    return{
                        setValue:function(key,value){
                             cache[key]  = value;
                              keys.push(key);
                       判断所存数据的个数是否超过了限制
                               if (keys.length>3) {
                              //如果超过了,就把最前面的数据key删掉(数组和对象中都要删除)
                                var key =keys.shift();                           
                                delete cache[key];
                              }
                            
                        },
                        getValue:function(key){
                             return cache[key] ;
                        }
                    }
               }
                   
               var cache =  createCache();
               cache.setValue("帅哥","王建军")
               cache.setValue("帅哥1","王建军")
               cache.setValue("帅哥2","王建军")
               cache.setValue("帅哥3","王建军")
               console.log( cache.getValue("帅哥"))
    

    相关文章

      网友评论

          本文标题:js面向对象(1)

          本文链接:https://www.haomeiwen.com/subject/zsqfzxtx.html