JavaScript-day08

复习
    1、正则表达式的数量词
        var pattern = /abc{3,5}/img;

        exp{3}        将前面的表达式匹配3次    
        exp{3,}        将前面的表达式匹配3+次
        exp{3,5}    将前面的表达式匹配3~5次

        exp*        将前面的表达式匹配0次或多次
        exp+        将前面的表达式匹配1次或多次

        贪婪匹配        -->  尽可能多的匹配
            var str = 'abc123456789'
            var pattern = /\d{3,}/img;

        非贪婪匹配    -->  尽可能少的匹配
            var str = 'abc123456789'
            var pattern = /\d{3,}?/img;

    2、判断邮箱格式

    3、包装器类型
        Number() String() Boolean()

        String()

        问题:'hello' --> ['h','e','l','l','o']
            1. for循环
            2. split()

        var str = 'hello';

        String.prototype.xxx
            length    
                字符串长度
            charAt(index)
                获取指定位置上的字符
            charCodeAt(index)
                获取指定位置上的字符编码
            indexOf(val)
                获取指定字符在字符串中首次出现的位置,如果该字符不属于字符串,返回-1

                拓展:数组去重 --> indexOf()
                    获取指定元素在数组中首次出现的索引
                    while(arr.indexOf(arr[i] != i)){
                        arr.splice(i,1);
                        //索引回退
                        i--;
                    }

            concat()
                连接两个字符串
            slice(begin,end)
                截取字符串,包含起始位置,不包含结束位置
            trim()
                删除字符串两边的空格,中间的空格无法删除
                var str = ' hello wrold ';
                console.log(str.trim()); // 'hello world'
            toUpperCase()
                转换为大写
            toLowerCase()
                转换为小写
            match(regexp)
                查找匹配内容,将匹配内容返回成一个数组
            split()
                将字符串分割成字符串数组
                使用''
                不使用''

    4、Math()对象
        Math.ceil()        向上舍入
        Math.floor()    向下舍入
        Math.round()    四舍五入
        Math.random()    生成随机数,0-1之间的小数

    5、Date日期对象
        1.实例化日期对象
            var date = new Date();
            世界标准时间        

        2.Date对象的方法    
            getDate()
                一个月中的某一天(0-31)
            getFullYear()
                年(四位数字)
            getMonth()
                月
            getDay()
                星期中的某一天
            getHours()
                时
            getMinutes()
                分
            getSeconds()
                秒
            getTime()
                时间戳

        3.标准时间转换为正常时间格式
            方法一:原生js
                补全位数
                    padStart(2,'0')
            方法二:使用第三方库(moment)
                var date = new Date();
                var result = moment(date).format('YYYY-MM-DD hh:mm:ss');

学习
    1、高级面向对象
        目的:利用一种机制帮我们创建具有特殊功能的对象

        之前创建对象的方式
            var obj = {
                name:'xpf',
                age:25,
                gender:'male'
            }
        再去创建obj2,并且obj2中的属性名与obj一样
            var obj2 = {
                name:'xpf',
                age:25,
                gender:'male'
            }
        再去创建obj3、obj4...

        问题:
            创建多个相似对象的时候会产生很多冗余的代码

        为了解决这样的问题,人们开始思考,能不能批量的创建对象?

    1) 封装/创建对象的过程 【api的本质】
        1. 工厂函数模式
            提供了一个函数,每调用一次该函数,返回一个对象
                function factory(name,age,gender){
                    var obj = {
                        name:name,
                        age:age,
                        gender:gender,
                        sayMessage:function(){
                            console.log(this.name,this.age,this.gender)
                        }
                    }
                    return obj;
                }

                var obj1 = factory('xpf',25,'male');
                var obj2 = factory('zhangsan',30,'male');

                console.log('obj1',obj1);//obj1 { name: 'xpf',age: 25,gender: 'male',sayMessage: [Function: sayMessage] }
                console.log('obj2',obj2);//obj2 { name: 'zhangsan',age: 30,gender: 'male',sayMessage: [Function: sayMessage] }

                obj1.sayMessage(); // xpf 25 male
                obj2.sayMessage(); // zhangsan 30 male

                需求:上面的代码创建的两个对象都是'人',现在希望创建两个对象,一个是'人',另一个是'狗'
                    function factory(name,age,gender){
                        return {
                            name:name,
                            age:age,
                            gender:gender,
                            sayMessage:function(){
                                console.log(this.name,this.age,this.gender)
                            }
                        }
                    }

                    var obj1 = factory('xpf',25,'male');
                    var obj2 = factory('小黑',3,'雄性');

                    console.log('obj1',obj1);
                    console.log('obj2',obj2);

                    console.log(typeof(obj1)); // object
                    console.log(typeof(obj2)); // object

                解决:
                    创建多个相似对象时,代买冗余的问题
                问题:
                    1、类型无法细分(由于使用了return {},所以创建出来的所有obj实例都是Object类型)
                    2、函数会重复的创建/破坏了封装性
                        创建多个对象的时候,需要多次的调用factory函数,即每调用一次该函数,都会内存中开辟一块属于sayMessage的空间

        2. 构造函数模式(手机)
            系统内置构造函数(自带的app)
                Object、Array、Date、Math、Number、String、RegExp
                new Object()
                new Array()

            自定义构造函数(下载的app)
                1) js中可以自定义构造函数,从而自定义对象的属性与方法
                2) 构造函数的首字母大写

                function Person(){}

                //人的构造函数
                function Person(name,age,gender){
                    this.name = name;
                    this.age = age;
                    this.gender = gender;
                    this.words = function(){
                        console.log('咕咕咕');
                    }
                }
                //per1叫做实例
                var per1 = new Person('xpf',25,'male');
                var per2 = new Person('zhangsan',25,'male');
                console.log('per1',per1);
                per1.words(); // 咕咕咕
                per2.words(); // 咕咕咕

                //狗的构造函数
                function Dog(name,age,gender){
                    this.name = name;
                    this.age = age;
                    this.gender = gender;
                }
                var dog1 = new Dog('小黑',3,'雄性');
                console.log('dog1',dog1);

                --->

                function Dog(name,age,gender){
                    var obj = {}
                    obj.name = name;
                    obj.age = age;
                    obj.gender = gender;
                }

            现象:
                1、构造函数的首字母大写 --> 规范
                2、没有显式的创建对象
                3、将属性和方法赋值给了this对象
                4、没有return语句

            本质:使用new关键字调用构造函数创建对象,实际上执行了如下步骤
                隐式
                1、创建一个对象
                2、将构造函数的作用域赋值给了这个对象(this指向该对象)
                3、执行构造函数中的代码(新增属性和方法)
                4、返回一个对象

            区别:构造函数与普通函数的区别
                1、构造函数也是一个普通函数,创建方式与普通函数一样(函数声明),但是构造函数的首字母大写
                    function Person(){}
                    function people(){}
                2、调用方式不一样
                    普通函数的调用方式:直接调用 people()
                    构造函数的调用方式:使用new关键字调用 new Person()
                3、返回值不一样
                    普通函数:因为没有返回值,结果为undefined
                        function people(){

                        }
                        var peo = people();
                        console.log(peo); // undefined
                    构造函数:会立马创建一个对象,所以说返回值为空对象
                        function Person(){

                        }
                        var per = new Person();
                        console.log(per); // Person {}
            解决:    
                解决了类型无法细分的问题
            问题:
                函数会重复的创建/破坏了封装性
                每个words方法都要在每个实例上重新创建一次,也就是说每次调用构造函数的时候,都会创建一个对象,而对象中又会每次的去创建一个words方法(函数)

        3. 构造函数与原型结合的模式(真正解决方案)
            属性保存在实例中,方法保存在构造函数的原型中
            function Person(name,age,gender){
                this.name = name;
                this.age = age;
                this.gender = gender;
            }
            Person.prototype.words = function(){
                console.log('哈哈哈');
            }

            var per1 = new Person('xpf',25,'male');
            var per2 = new Person('zhangsan',30,'male');
            console.log('per1',per1);
            console.log('per2',per2);
            per1.words();
            per2.words();
            console.log(per1.words === per2.words); // true

            per1和per2都可以调用构造函数原型中方法words

    2) 继承
        当我们创建一个构造函数的时候,构造函数会获得一个prototype属性,该属性是一个指针,它会指向一原型对象,原型对象中也包含一个属性constructor,该属性也是一个指针,指向构造函数,当我们使用该构造函数创建实例的时候,该实例也会获得一个属性[[Prototype]],该属性会指向原型对象
        function Person(){}

        1. 原型链继承 (子构造函数的原型指向父构造函数的实例)
            原理:让一个引用类型继承另一个引用类型的属性和方法
            核心代码:
                Person2.prototype = new Person1();
                Person2.prototype.constructor = Person2;
            
            function Person1(name,age,gender){
                this.name = name;
                this.age = age;
                this.gender = gender;
            }
            Person1.prototype.money = function(){
                console.log('哈哈哈,我很有钱!');
            }
            var per1 = new Person1('zhangsan',12,'male');
            var per2 = new Person1('lisi',10,'female');
            console.log(per1);
            console.log(per2);
            per1.money();
            per2.money();

            Person2.prototype = new Person1();
            Person2.prototype.constructor = Person2;

            function Person2(name,age,gender){
                this.name = name;
                this.age = age;
                this.gender = gender;
            }

            var per3 = new Person2('xiaohong',10,'female');
            var per4 = new Person2('xiaoming',8,'male');
            console.log('per3',per3);
            console.log('per4',per4);
            per3.money();

        2. 借用构造函数(不仅方法可以继承,属性也可以继承)    
            核心代码:
                Person1.call(this,name,age,gender)

            function Person1(name,age,gender){
                this.name = name;
                this.age = age;
                this.gender = gender;
            }
            Person1.prototype.money = function(){
                console.log('哈哈哈,我很有钱!');
            }
            var per1 = new Person1('zhangsan',12,'male');
            var per2 = new Person1('lisi',10,'female');
            console.log(per1);
            console.log(per2);
            per1.money();
            per2.money();

            Person2.prototype = new Person1();
            Person2.prototype.constructor = Person2;

            function Person2(name,age,gender){
                //借用构造函数
                Person1.call(this,name,age,gender);
            }

            var per3 = new Person2('xiaohong',10,'female');
            var per4 = new Person2('xiaoming',8,'male');
            console.log('per3',per3);
            console.log('per4',per4);
            per3.money();

        es5正式完结
            ECMAScript5
            DOM
            BOM 2两天

    2、DOM(文档对象模型)
        1.作用
            js操作html
            选中浏览器页面任意元素
                var dom = document.getElementById('#app')
                var dom = document.getElementsByTagName('test')
            绑定事件
                dom.onclick = function(){}
            监听    
                dom.addEventListener(function(){})

        2.DOM构造函数树
            <div>hello</div>

            Node(节点)
                文档节点    Document类型 
                元素节点    Element类型         <div></div>
                文本节点    Text类型            hello
                注释节点    Comment类型        <!--注释-->

        3.实例化(如何创建一个对象)
            var dom = document.getElementById('one');

        4.API(火狐mdn)
            1) Document
                表示整个html文档,一般情况下一个html可以使用一个Document的实例来表示,即document

                属性
                    title
                    head
                    body
                方法
                    getElementById()
                    getElementsByClassName()
                    getElementsByName()
                    getElementsByTagName()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值