JavaScript04:面向对象

标准对象

typeof关键字获取对象的类型

typeof 123 //'number'
typeof "123" // 'string'
typeof true // 'boolean'
typeof NaN // 'number'
typeof [] // 'object'
typeof {} // 'object'
typeof Math.abs // 'function'
typeof undefined // 'undefined'
typeof null // 'object'

Date

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">
    <title>我的网页</title>

    <script>

        "use strict";

        /**
         * 获取日期和时间
         */
        let now = new Date();
        console.log(now); // 中国标准时间
        console.log(now.getFullYear()); // 年
        console.log(now.getMonth()); // 月(从0开始)
        console.log(now.getDate()); // 日
        console.log(now.getDay()); // 星期几
        console.log(now.getHours()); // 时
        console.log(now.getMinutes()); // 分
        console.log(now.getSeconds()); // 秒
        console.log(now.getTime()); // 时间戳

        /**
         * 转换格式
         */
        console.log(now.toLocaleString()); // 转换为正常格式
        console.log(new Date(1648000989044)); // 时间戳转换为标准时间

    </script>

</head>

<body>

</body>

</html>

JSON

JSON(JavaScript Object Notation)是一种层次结构清晰的轻量级数据交换格式,任何JavaScript对象都可以转换为JSON格式,语法格式也一样

把JavaScript对象序列化成一个JSON格式的字符串,就能够通过网络传递给其他计算机

把JSON格式的字符串反序列化成一个JavaScript对象,就可以在JavaScript中直接使用这个对象

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">
    <title>我的网页</title>

    <script>

        "use strict";

        let person = {
            name: "ty",
            age: 24,
            gender: "man"
        }

        /**
         * 序列化
         * JSON.stringify()方法将对象转换为JSON字符串,第二种写法可以显示层次结构
         * 对象的属性名不用引号
         */
        console.log(JSON.stringify(person));
        console.log(JSON.stringify(person, null, ' '));

        /**
         * 反序列化
         * JSON.parse()方法将JSON字符串转换为对象
         * 对象属性名要用引号,为了避免转义,{}必须用不同的引号括起来
         */
        console.log(JSON.parse('{"name":"ty","age":24,"gender":"man"}'));

    </script>

</head>

<body>

</body>

</html>

RegExp

正则表达式:可以直接通过/正则表达式/写出来,或者是通过new RegExp('正则表达式')创建一个RegExp对象

\d可以匹配一个数字,\w可以匹配一个字母或数字,.可以匹配任意一个字符,*表示任意个字符(包括0个),+表示至少一个字符,?表示0个或1个字符,+?表示非贪婪匹配,g表示全局搜索,{n}表示n个字符,{n,m}表示n-m个字符(不能有空格),\s可以匹配一个空格(也包括Tab等空白符),\可以转义特殊字符,[]表示范围(如[0-9a-zA-Z_]可以匹配一个数字、字母或者下划线),A|B可以匹配A或B,()表示分组(可以提取子串),^表示行的开头,$表示行的结束

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">
    <title>我的网页</title>

</head>

<body>

</body>

</html>

<script>

    "use strict";

    let reg = /^\d{3}-\d{3,8}$/;

    /**
     * test()方法可以测试字符串是否满足正则表达式
     */
    console.log(reg.test("111-123443"));
    console.log(reg.test("111-123443z"));

    /**
     * split()方法切分字符串
     */
    console.log("a b    c d".split(/\s+/));
    console.log("a, b,   c,d".split(/[\s\,]+/));

    /**
     * exec()方法获取子串
     * 匹配成功会返回一个数组
     * 匹配失败返回null
     */
    reg = /^(\d{3})-(\d{3,8})$/;
    console.log(reg.exec("111-123443"));
    console.log(reg.exec("111 123443"));

    reg = /^([0-9]|[0-9]|1[0-9]|2[0-3]):([0-9]|0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9]):([0-9]|0[0-9]|1[0-9]|2[0-9]|3[0-9]|4[0-9]|5[0-9])$/;
    console.log(reg.exec("20:30:30"));

    reg = /^([\w.]+)@(\w+)\.(\w{3})$/;
    console.log(reg.exec("bill.gates@microsoft.com"));

    /**
     * 非贪婪匹配
     * 默认"+"是贪婪匹配,会匹配最多的字符,因此不能单独拿到后面的000
     * 加个"?"是非贪婪匹配,尽可能少匹配
     */
    reg = /^(\d+)(0*)$/;
    let reg1 = /^(\d+?)(0*)$/;
    console.log(reg.exec("1023000"));
    console.log(reg1.exec("1023000"));

    /**
     * 全局搜索(多次匹配)
     * 当指定g标志后,每次运行exec(),正则表达式本身会更新lastIndex属性,表示上次匹配到的最后索引
     * 不能使用/^...$/,那样只会最多匹配一次
     *
     */
    reg = /[a-zA-Z]+Script/g;

    for (let i = 0; i < 4; i++) {

        console.log(reg.exec("JavaScript, VBScript, JScript and ECMAScript"));
        console.log(reg.lastIndex);
    }

</script>

原型链

JavaScript对每个创建的对象都会设置一个原型,指向它的原型对象

原型链:当我们用obj.xxx访问一个对象的属性时,JavaScript引擎先在当前对象上查找该属性,如果没有找到,就到其原型对象上找,如果还没有找到,就一直上溯到Object.prototype对象,最后,如果还没有找到,就只能返回undefined

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">
    <title>我的网页</title>

    <script>

        "use strict";

        /**
         * 数组对象的原型链
         * arr ----> Array.prototype ----> Object.prototype ----> null
         * Array.prototype定义了indexOf()、shift()等方法,因此可以在所有的Array对象上直接调用这些方法
         */
        let arr = [1, 2];

        /**
         * 函数也是对象,函数对象的原型链
         * test ----> Function.prototype ----> Object.prototype ----> null
         * Function.prototype定义了apply()等方法,因此所有函数都可以调用apply()方法
         */
        function test(){}

    </script>

</head>

<body>

</body>

</html>

原型继承

JavaScript不区分类和实例的概念,而是通过原型(prototype)来实现面向对象编程,将其他对象作为原型创建一个类似的对象,间接达到继承的目的

JavaScript的原型链和Java的Class区别在于,它没有“Class”的概念,所有对象都是实例,所谓继承关系不过是把一个对象的原型指向另一个对象而已

因此可以随意变更要继承的原型对象,但同时只能继承一个原型

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">
    <title>我的网页</title>

    <script>

        "use strict";

        let xiaoming = {
            name: "xiaoming",
            age: 24,
            run: function (){
                console.log(this.name + " is running");
            }
        }

        console.log(xiaoming);
        xiaoming.run();

        let xiaohong = {
            name: "xiaohong"
        }

        /**
         * JavaScript没有类的概念,而是通过原型属性__proto__,让新对象继承其他对象
         * 间接等效于两个对象都是同一个模板衍生出来的,这样也就拥有了其他对象的方法和属性
         * 不建议这么使用
         */
        xiaohong.__proto__ = xiaoming;
        console.log(xiaohong);
        xiaohong.run();
        console.log(xiaohong.age);

        let bird = {
            name: "bird",
            fly: function (){
                console.log(this.name + " is flying");
            }
        }

        /**
         * 可以变更要继承的原型对象
         */
        xiaohong.__proto__ = bird;
        xiaohong.fly();

    </script>

</head>

<body>

</body>

</html>

class继承

几乎和Java定义类一样,不过构造器方法统一用constructor()方法表示,子类构造器中必须要先调用父类构造器

<!DOCTYPE html>

<html lang="en">

<head>

    <meta charset="UTF-8">
    <title>我的网页</title>

    <script>

        "use strict";

        /**
         * class定义类
         */
        class Person{

            constructor(name) {
                this.name = name;
            }

            who(){
                console.log(this.name);
            }
        }

        /**
         * 继承
         * 子类构造器中必须要先调用父类构造器
         */
        class Chinese extends Person{

            constructor(name, color) {
                super(name);
                this.color = color;
            }
        }

        let xiaoming = new Person("xiaoming");
        xiaoming.who();

    </script>

</head>

<body>

</body>

</html>
posted @ 2022-03-23 18:00  振袖秋枫问红叶  阅读(32)  评论(0)    收藏  举报