JavaScript的学习的学习与实践

132 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第3天,点击查看活动详情

1. 创建对象

1.1 利用字面量创建对象

    <script>
        // 1.利用对象字面量创建对象 {}
        
        // var obj = {};  // 创建了一个空的对象 
		
        var obj = {
                uname: '王小懒',
                age: 22,
                sex: '男',
                sayHi: function() {
                    console.log('你好呀,未来!');

                }
            }
			
     			
            // 2. 使用对象
            // (1). 调用对象的属性 我们采取 对象名.属性名 .
			
        console.log(obj.uname);
		
        // (2). 调用属性还有一种方法 对象名['属性名']
		
        console.log(obj['age']);
		
        // (3) 调用对象的方法 sayHi   对象名.方法名() 
		
        obj.sayHi();
		
    </script>
  • 对象里面的属性调用:对象.属性名,这个小点.就理解为“的“
  • 对象里面属性的另一种调用方式:对象[‘属性名’],注意方括号里面的属性必须加引号,我们后面会用
  • 对象里面的方法调用∶对象.方法名),注意这个方法名字后面一定加括号

变量,属性,函数,方法的相同点与不同点

  • 变量∶单独声明赋值,单独存在
  • 属性:对象里面的变量称为属性,不需要声明,用来描述该对象的特征
  • 函数:单独存在的,通过“函数名()”的方式就可以调用
  • 方法:对象里面的函数称为方法,方法不需要声明,使用“对象.方法名()”的方式就可以调用,方法用来描述该对象的行为和功能。

image.png

1.2 利用new Object来创建对象

    <script>
        // 利用 new Object 创建对象
        
        var obj = new Object(); // 创建了一个空的对象
        
        obj.uname = '王小懒';
        obj.age = 24;
        obj.sex = '男';
        obj.sayHi = function() {
                console.log('你好');

            }
            
            // (1) 利用 等号 = 赋值的方法 添加对象的属性和方法

            
        console.log(obj.uname);
        console.log(obj['sex']);
        obj.sayHi();
        
    </script>

1.3 利用构造函数创建对象

1.3.1 为什么需要构造函数

image.png

image.png

    <script>
        // 利用构造函数创建对象
    
	
        // 构造函数的语法格式
        // function 构造函数名() {
        //     this.属性 = 值;
        //     this.方法 = function() {}
        // }
		
        // 调用:new 构造函数名();
        function Star(uname, age, sex) {
            this.name = uname;
            this.age = age;
            this.sex = sex;
            this.sing = function(sang) {
                console.log(sang);

            }
        }
		
        var wlh = new Star('王力宏', 18, '男'); // 调用函数返回的是一个对象
        console.log(wlh.name);
        console.log(wlh['sex']);
        wlh.sing('大城小爱');
		
        var wf = new Star('汪峰', 19, '男');
        console.log(wf.name);
        console.log(wf.age);
        wf.sing('北京北京')



        // 1. 构造函数名字首字母要大写

        // 3. 我们调用构造函数 必须使用 new
        // 4. 我们只要new Star() 调用函数就创建一个对象 wlh  {}
        // 5. 我们的属性和方法前面必须添加 this
    </script>

new 关键字的执行过程

  1. 在内存中创建一个新的空对象。
  2. 让this指向这个新的对象。
  3. 执行构造函数里面的代码,给这个新对象添加属性和方法。
  4. 返回这个新对象(所以构造函数里面不需要return )。

image.png

2. 遍历对象


    <script>
        // 遍历对象 
        var obj = {
                name: '王小懒',
                age: 18,
                sex: '男',
                fn: function() {}
            }
			
            // console.log(obj.name);
            // console.log(obj.age);
            // console.log(obj.sex);
			
            // for in 遍历我们的对象
            // for (变量 in 对象) {

        // }
        for (var k in obj) {
            console.log(k); // k 变量 输出  得到的是 属性名
            console.log(obj[k]); // obj[k] 得到是 属性值

        }

    </script>

2. 表单全选以及取消全选的制作

image.png

全选和取消全选做法∶让下面所有复选框的checked属性(选中状态)跟随全选按钮即可

下面复选框需要全部选中,上面全选才能选中做法∶给下面所有复选框绑定点击事件,每次点击,都 要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的,上面全选就不选中。

    <script>
        // 1. 全选和取消全选做法:  让下面所有复选框的checked属性(选中状态) 跟随 全选按钮即可
        // 获取元素
        var j_cbAll = document.getElementById('j_cbAll'); // 全选按钮
        var j_tbs = document.getElementById('j_tb').getElementsByTagName('input'); // 下面所有的复选框
        // 注册事件
        j_cbAll.onclick = function() {
                // this.checked 它可以得到当前复选框的选中状态如果是true 就是选中,如果是false 就是未选中
                console.log(this.checked);
                for (var i = 0; i < j_tbs.length; i++) {
                    j_tbs[i].checked = this.checked;
                }
            }
            // 2. 下面复选框需要全部选中, 上面全选才能选中做法: 给下面所有复选框绑定点击事件,每次点击,都要循环查看下面所有的复选框是否有没选中的,如果有一个没选中的, 上面全选就不选中。
        for (var i = 0; i < j_tbs.length; i++) {
            j_tbs[i].onclick = function() {
                // flag 控制全选按钮是否选中
                var flag = true;
                // 每次点击下面的复选框都要循环检查者4个小按钮是否全被选中
                for (var i = 0; i < j_tbs.length; i++) {
                    if (!j_tbs[i].checked) {
                        flag = false;
                        break; // 退出for循环 这样可以提高执行效率 因为只要有一个没有选中,剩下的就无需循环判断了
                    }
                }
                j_cbAll.checked = flag;
            }
        }
    </script>

3.tab栏切换制作(点击那一栏显示那一栏的内容,其他栏的内容隐藏)

image.png

  1. Tab栏切换有2个大的模块
  2. 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想)修改类名的方式
  3. 下面的模块内容,会跟随上面的选项卡变化。所以下面模块变化写到点击事件里面。
  4. 规律:下面的模块显示内容和上面的选项卡——对应,相匹配。
    <style>
        * {
            margin: 0;
            padding: 0;
        }
       
        li {
            list-style-type: none;
        }
        
        .tab {
            width: 978px;
            margin: 100px auto;
        }
        
        .tab_list {
            height: 39px;
            border: 1px solid #ccc;
            background-color: #f1f1f1;
        }
        
        .tab_list li {
            float: left;
            height: 39px;
            line-height: 39px;
            padding: 0 20px;
            text-align: center;
            cursor: pointer;
        }
        
        .tab_list .current {
            background-color: #c81623;
            color: #fff;
        }
        
        .item_info {
            padding: 20px 0 0 20px;
        }
        
        .item {
            display: none;
        }
    </style>
</head>

<body>
    <div class="tab">
        <div class="tab_list">
            <ul>
                <li class="current">商品介绍</li>
                <li>规格与包装</li>
                <li>售后保障</li>
                <li>商品评价(50000)</li>
                <li>手机社区</li>
            </ul>
        </div>
        <div class="tab_con">
            <div class="item" style="display: block;">
                商品介绍模块内容
            </div>
            <div class="item">
                规格与包装模块内容
            </div>
            <div class="item">
                售后保障模块内容
            </div>
            <div class="item">
                商品评价(50000)模块内容
            </div>
            <div class="item">
                手机社区模块内容
            </div>

        </div>
    </div>
    <script>
        // 获取元素
        var tab_list = document.querySelector('.tab_list');
        var lis = tab_list.querySelectorAll('li');
        var items = document.querySelectorAll('.item');
        // for循环绑定点击事件
        for (var i = 0; i < lis.length; i++) {
            // 开始给5个小li 设置索引号 
            lis[i].setAttribute('index', i);
            lis[i].onclick = function() {
                // 1. 上的模块选项卡,点击某一个,当前这一个底色会是红色,其余不变(排他思想) 修改类名的方式

                // 干掉所有人 其余的li清除 class 这个类
                for (var i = 0; i < lis.length; i++) {
                    lis[i].className = '';
                }
                // 留下我自己 
                this.className = 'current';
                // 2. 下面的显示内容模块
                var index = this.getAttribute('index');
                console.log(index);
                // 干掉所有人 让其余的item 这些div 隐藏
                for (var i = 0; i < items.length; i++) {
                    items[i].style.display = 'none';
                }
                // 留下我自己 让对应的item 显示出来
                items[index].style.display = 'block';
            }
        }
    </script>
</body>

4. 密码框验证信息的案例

image.png

  1. 首先判断的事件是表单失去焦点onblur
  2. 如果输入正确则提示正确的信息颜色为绿色小图标变化
  3. 如果输入不是6到16位,则提示错误信息颜色为红色小图标变化
  4. 因为里面变化样式较多,我们采取className修改样式
<!DOCTYPE html>
<html lang="en">

<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Document</title>
    <style>
        div {
            width: 600px;
            margin: 100px auto;
        }
        
        .message {
            display: inline-block;
            font-size: 12px;
            color: #999;
            background: url(images/mess.png) no-repeat left center;
            padding-left: 20px;
        }
        
        .wrong {
            color: red;
            background-image: url(images/wrong.png);
        }
        
        .right {
            color: green;
            background-image: url(images/right.png);
        }
    </style>
</head>

<body>
    <div class="register">
        <input type="password" class="ipt">
        <p class="message">请输入6~16位密码</p>
    </div>
    <script>
        //获取事件
        var ipt = document.querySelector('.ipt');
        var message = document.querySelector('.message');
        //2. 注册事件 失去焦点
        ipt.onblur = function() {
            // 根据表单里面值的长度 ipt.value.length
            if (this.value.length < 6 || this.value.length > 16) {
              
				// 当输入的值不满足条件的时候,增加一个wrong的类名样式,message需要保留
				
                message.className = 'message wrong';
                message.innerHTML = '您输入的位数不对要求6~16位';
				
            } else {
			
                message.className = 'message right';
                message.innerHTML = '您输入的正确';
            }
        }
    </script>
</body>

</html>