性能优化、面向对象、引用

2017-11-10  本文已影响0人  z_j_r

前言:

现在不玩命,将来命玩你,现在不努力,未来不给力

--------------------------------正文---------------------------------

性能优化

  原因:
      1.稳定
      2.扩展
      3.性能
  包含:
      网络性能
      执行性能
1、网络性能(要用到第三方工具)
    Chrome      NetWork       需要经验支撑分析。

    Firefox     YSLow(http://yslow.org/)
        插件版:  必须先安装     Firebug
            步骤:进入YSLow官网
                  点击Firefox
                  点击Add to Firefox

            一定要在选项中把自动运行勾选

        书签版
            步骤:进入YSLow官网
                  点击install
                  把yslow按钮拖放到书签栏
                  重启浏览器
                书签版不能检测https

            有问题了。
网络性能优化方法
     1.减少http请求
           1个文件=一次连接+一次请求+一次等待+一次响应
           100个文件=100连接+100请求+100等待+100响应
     2.合并文件
           a).减少http请求
           b).让资源更小
                4KB一个单位,不足4KB按照4KB算
     3.压缩代码
           让文件更小
     4.使用CDN加速
     5.使用GZIP压缩
     6.使用DNS
     7.懒加载

更多搜索:雅虎军规

2、执行性能
     1.尽量不使用全局变量       (变量不回收)
     2.尽量少使用闭包           (使用后变量不一定会被回收)
     3.减少DOM操作              (属性太多,找的时候浪费)
     4.少使用定时器             (定时器不稳定)
     5.尽量使用正则操作字符串    (简单)
     6.尽量不使用属性           (找起来麻烦)
     7.尽量使用CSS3             (性能高)

         尽量不使用属性
           eg:  var len = arr.length;
                for(var i=0;i<len;i++){
            }

            字符串本身不可更改

面向对象(OOP)(不知道原理,但是不影响使用)

    类       Class       泛指一类事物
    对象     Object      某一个具体的东西
对象的组成
    属性——特征
    方法——行为

    什么是属性:变量和属性一样
               属性是属于某个对象的
               变量是自由的
    什么是方法:函数和方法一样
               方法是属于某个对象的
                函数是自由的
创建一个类
     构造函数:因为是创建对象的
  eg:
        //构造函数
        function Person(name,age,gender){
            //工厂模式
            //原料
            var obj = new Object();
            //加工
            obj.name = name;
            obj.age = age;
            obj.gender = gender;
            obj.showName = function(){
                return this.name;
            };
            obj.showAge = function(){
                return this.age;
            };
            obj.showGender = function(){
                return this.gender;
            };
            //出厂
            return obj;
        }
        var p1 = Person('老王',40,'男');
        var p2 = Person('李四',22,'男');
        document.write(p1.showName==p2.showName);          // false

出现两个问题:
1、没有new
2、同一个类的方法,不相等

    加new
        1.开头加new Object();
        2.结尾加return this;

    加方法不能直接在构造里写。   
        给构造的原型加
            构造函数的原型:Person.prototype

    属性给构造的this加
    方法给构造的原型加
  eg:
        //构造函数
        function Person(name,age,gender){
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
        Person.prototype.showName = function(){
            return this.name;
        };
        Person.prototype.showAge = function(){
            return this.age;
        };
        Person.prototype.showGender = function(){
            return this.gender;
        };
        var p1 = new Person('老王',40,'男');
        document.write('我叫'+p1.showName()+',今年'+p1.showAge()+'岁,性别'+p1.showGender());
        var p2 = new Person('韩梅梅',30,'女');
        alert(p1.showName==p2.showName);               // true

this?

    不看定义,只看调用
    方法是谁的,this就是谁
    优先级:
        高   
            new              Object
            定时器            window
            方法、事件        对象本身
            正常调用          window\undefind
        低
    如果函数不止一层,那函数只管一层、this只看最后一次调用
    this永远只看最后一次调用
面向对象三大特性
    封装      抽出核心封装
    继承      子继承父.父类有的,子类一定有。子类有的,父类不一定有。父类改变,子类跟着变
    多态      多种状态、多重继承
继承
    属性
    方法

    Person  人类
        属性:name age gender
        方法:showName() showAge() showGender()
    Worker  工人类 
        属性:name age gender job
        方法:showName() showAge() showGender() showJob()

    矫正this指向
        fn.call(this指向谁,arg1,arg2....);
        或者
        fn.apply(this指向谁,[arg1,arg2,arg3...]);

    属性继承
        function 子类(a,b){
            父类.call(this,a,b);
            或者
            父类.apply(this,arguments);
        }
    方法继承
        a).
        子类.prototype = 父类.prototype;
        问题:
            子类的私有方法,父类也有
            原因:
                引用
        b).
        for(var key in 父类.prototype){
            子类.prototype[key] = 父类.prototype[key];
        }
        问题:
            子类的实例,不属于父类
        c).
        子类.prototpye = new 父类();
        瑕疵:
            子类实例.constructor 等于父类
        d).
        子类.prototype = new 父类();
        子类.prototype.constructor = 子类;

万物皆对象

   eg:
        function Person(name,age,gender){
            this.name = name;
            this.age = age;
            this.gender = gender;
        }
        Person.prototype.showName = function(){
            return this.name;
        };
        Person.prototype.showAge = function(){
            return this.age;
        };
        Person.prototype.showGender = function(){
            return this.gender;
        };

        function Worker(name,age,gender,job){
            // arguments  实参参数集合
            // call  apply  改变this指向
            Person.apply(this,arguemnts);
            this.job = job;
        }
        Worker.prototype = new Person();
        Worker.prototype.constructor = Worker;
        Worker.prototype.showJob = function(){
            return this.job;
        };

检测

typeof              检测基本数据类型     Array、Date也是Object
instanceof          检测复合类型         检测是否是Array、Date,但检测不出这两项和Object的区别
constructor         检测构造函数         检测是否是Object,区分Array、Date和Object

原型链

先在当前实例身上找,如果没有找构造类,如果类没有找父类原型,一级一级往上找,直到找到Object的原型。如果没有就是undefined

上一篇下一篇

猜你喜欢

热点阅读