欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

闭包及访问量属性和类与对象解构赋值以及js中对html中的dom操作(时间有点紧,没全理解透,需回头整理)

程序员文章站 2022-03-27 08:32:10
...

时间有点紧迫,写完来不及整理,直接贴的源代码,马上就上课了

回头回来整理

本文中提到的新知识点参数:

针对访问器属性的操作,
get是读取数据
set写入数据

类与对象的操作新知识点参数:

new 构建的新对象需要在对象名前增加
extendses6class中子类继承扩展中使用的,

新学了es6中的操作

class 操作

新es6中构造方法使用

constructor

继承公共方法使用的代码

super

js中操作html操作常用参数

点击事件的新参数
onclick不算新参数,之前也学到过,记一下
document对html操作的参数,也可以说是选中的参数
querySelectorAll页面选中一组的操作
querySelector页面选中一个的操作

具体示例均在以下代码中,如有不明白部分,需看1月4日教学文档及视频

闭包函数

  1. // 闭包函数
  2. // 先创建一个声明
  3. // *变量
  4. let name = 10;
  5. let z = function (a, b) {
  6. let c = 10;
  7. // 声明一个c等于10
  8. // 空参数变量是a,b
  9. // c是内部变量
  10. // name是全局变量
  11. // 声明在外的变量,也叫*变量
  12. return a + b + c + name;
  13. // 老师的意思是a,b,c均为私有变量
  14. };
  15. // 给a和b传入参数
  16. console.log(z(1, 2));
  17. // 当实际开发中的闭包,必须满足2个条件,父级>子级
  18. // 老师说的意思是父子函数,我这理解能力哎
  19. // 闭包
  20. // 1. 父子函数
  21. // 2. 子函数调用了父函数中的变量
  22. z = function (a) {
  23. let l = function (b) {
  24. return a + b;
  25. };
  26. return l;
  27. };
  28. let n = z(6);
  29. console.log(n);
  30. // 当前返回给a的值是6,但是子函数b的值并没有,已经提示l为函数
  31. // 给子函数二次返回值 当前函数n等于外部的函数值
  32. console.log(n(6));
  33. // 已经提示是12了,明白了么?自己如果以后不明白,回来看视频,三遍以后还忘记,就...
  34. // 闭包偏函数
  35. // 我感觉类似上面的闭包,就是二次传入咯
  36. // 当一个函数需要多个参数的时候,不一定一次性全部传入,可以分批传入
  37. let a = function (a, b, c) {
  38. return a + b + c;
  39. };
  40. console.log(a(1, 2, 3));
  41. console.log(a(1, 2));
  42. // 提示nan,好像是空的意思 应该理解为缺少
  43. a = function (a, b) {
  44. let s = function (c) {
  45. return a + b + c;
  46. };
  47. return s;
  48. };
  49. let e = a(1, 2);
  50. console.log(e);
  51. // 这里提示了s函数,
  52. // 二次传入s
  53. console.log(e(1));
  54. // 等于4;
  55. // 则是分两次传入的,其实还可以分三次,四次,五次,六次等传入
  56. // 感觉以后用到的会更多
  57. // 做一个分三次传入
  58. let t = function (a) {
  59. return function (b) {
  60. return function (c) {
  61. return a + b + c;
  62. };
  63. };
  64. };
  65. console.log(t(1)(2)(3));
  66. t = function (a) {
  67. return function (b) {
  68. return function (c) {
  69. return a + b + c;
  70. };
  71. };
  72. };
  73. let r = t(1);
  74. // 刚刚试了下,返回的t如果为t(),然后在下面打印的时候,输入3个值不行,在声明的时候需要提前传入一个值
  75. console.log(r(1)(2));
  76. // 将参数逐个传入, 叫"柯里化"函数
  77. // 服务器获取数据, 大量数据分块获取,分批传入
  78. // 将上面的柯里化函数,改为箭头函数
  79. t = a => b => c => a + b + c;
  80. console.log(t(1)(2)(3));
  81. // 也是一样的
  82. // ! 把闭包: 纯函数
  83. // 纯函数: 函数中用到的变量全间自己的, 没有"*变量"
  84. // 如果函数内部必须要用到外部变量怎么办? 通过参数传入
  85. // 外部变量
  86. let zhekou = 0.8;
  87. function chaoshi(wj, zhekou = 1) {
  88. return wj * zhekou;
  89. // 这个纯函数变量,我也没太懂意思,但是我感觉意思就是,如果函数内对象的值默认了一个,是大于外部变量的,想要使用外部变量,就需要传入参数值
  90. }
  91. // chaoshi(1200, 5000);
  92. console.log(chaoshi(1200, zhekou));
访问器属性
  1. // 访问器属性
  2. // 添加对象,超时的蔬菜
  3. // data现有的蔬菜和价格等属性
  4. let chaoshi = {
  5. data: { name: "青菜", mn: "6元", leimu: "蔬菜" },
  6. // 增加一个函数,返回当前蔬菜的价格,
  7. sc() {
  8. return chaoshi.data.mn;
  9. },
  10. // 增加一个函数,函数名sb,对象名为mn,外部传入值给mn,mn又赋值给了chaoshi.data.mn所以当前超市的价格变动了
  11. sb(mn) {
  12. chaoshi.data.mn = mn;
  13. },
  14. };
  15. console.log(chaoshi.sc());
  16. chaoshi.sb("10元");
  17. // 超市上调价格
  18. console.log(chaoshi.sc());
  1. // 访问器属性
  2. // 添加对象,超时的蔬菜
  3. // data现有的蔬菜和价格等属性
  4. let chaoshi = {
  5. data: { name: "青菜", mn: "6元", leimu: "蔬菜" },
  6. // 增加一个函数,返回当前蔬菜的价格,
  7. // getage
  8. sc() {
  9. return chaoshi.data.mn;
  10. },
  11. // 增加一个函数,函数名sb,对象名为mn,外部传入值给mn,mn又赋值给了chaoshi.data.mn所以当前超市的价格变动了
  12. // setage
  13. sb(mn) {
  14. chaoshi.data.mn = mn;
  15. // 进行的赋值,并不需要let声明
  16. },
  17. };
  18. console.log(chaoshi.sc());
  19. chaoshi.sb("10元");
  20. // 超市上调价格
  21. console.log(chaoshi.sc());
  22. chaoshi = {
  23. data: { name: "青菜", mn: 6, leimu: "蔬菜" },
  24. // 增加一个函数,返回当前蔬菜的价格,
  25. // getage
  26. sc() {
  27. return chaoshi.data.mn;
  28. },
  29. // 增加一个函数,函数名sb,对象名为mn,外部传入值给mn,mn又赋值给了chaoshi.data.mn所以当前超市的价格变动了
  30. // setage
  31. sb(mn) {
  32. if (mn <= 5 && mn >= 100) {
  33. chaoshi.data.mn = mn;
  34. } else {
  35. console.log("超出市场价格");
  36. }
  37. },
  38. };
  39. console.log(chaoshi.sc());
  40. chaoshi.sb(3);
  41. console.log(chaoshi.sc());
  42. chaoshi = {
  43. data: { name: "青菜", mn: 6, leimu: "蔬菜" },
  44. // 增加一个函数,返回当前蔬菜的价格,
  45. // getage
  46. get mn() {
  47. return this.data.mn;
  48. },
  49. // 增加一个函数,函数名sb,对象名为mn,外部传入值给mn,mn又赋值给了chaoshi.data.mn所以当前超市的价格变动了
  50. // setage
  51. set mn(mn) {
  52. if (mn <= 5 && mn >= 100) {
  53. this.data.mn = mn;
  54. } else {
  55. console.log("超出市场价格");
  56. }
  57. },
  58. };
  59. console.log(chaoshi.mn);
  60. chaoshi.mn = 150;
  61. console.log(chaoshi.mn);
  62. let ad = {
  63. data: { name: "红牛", lei: "饮料", jiage: 5 },
  64. // 下面是读取价格 目前是无伪装状态
  65. jiage() {
  66. return this.data.jiage;
  67. },
  68. // 下面是修改价格
  69. xiugaijiage(jiage) {
  70. this.data.jiage = jiage;
  71. },
  72. };
  73. console.log(ad.jiage());
  74. ad.xiugaijiage(10);
  75. console.log(ad.jiage());
  76. // 第二轮测试,用get跟set
  77. ad = {
  78. data: { name: "红牛", lei: "饮料", jiage: 5 },
  79. // 下面是读取价格 目前是无伪装状态
  80. // get跟set相当于特殊函数,类似function
  81. get jiage() {
  82. return this.data.jiage;
  83. },
  84. // 下面是修改价格
  85. set jiage(jiage) {
  86. this.data.jiage = jiage;
  87. },
  88. };
  89. console.log(ad.jiage);
  90. // 使用get跟set之后, 不在使用ad.xiugaijiage(10);而是根据用户习惯
  91. ad.jiage = 10;
  92. console.log(ad.jiage);
类与对象
  1. // 创建类与对象
  2. // 构造函数创建类与对象
  3. // 构建函数创建类 声明的单次首字母要大写,创建一个we的类
  4. let We = function (qqh, mingzi) {
  5. // 赋值操作
  6. this.qqh = qqh;
  7. this.mingzi = mingzi;
  8. };
  9. // 构造函数要必须加入一个new来执行,看下面的
  10. const weqq = new We("123456789", "名字");
  11. console.log(weqq);
  12. // 为什么要这样用?因为可以重复使用这个构造函数的类,就是一个类库,可以重复使用这个类(函数)创建多个对象
  13. const weqw = new We("88888888", "靓号");
  14. console.log(weqw);
  15. ////////////////////////////////////////////////////////
  16. // 这里理解为给构造函数We创建一个对象方法,使用.prototype ,添加在we.prototype原型上,命名为gettttt,之后可以被所有的类实例跟对象公用
  17. We.prototype.gettttt = function () {
  18. return `qqh = ${this.qqh},mingzi=${this.mingzi}`;
  19. };
  20. // 给类User添加自定义方法,必须添加到它的原型对象属性上
  21. // 声明在 User.prototype原型上的方法, 被所有类实例/对象所共用
  22. console.log(weqq.gettttt());
  23. console.log(weqw.gettttt());
  24. // 拿老师的说法来看
  25. // 对象方法一般是公共, 操作的是当前对象的属性
  26. // 任何一个函数都有一个属性, 叫原型, 这个原型,对于普通函数来说,没用
  27. // 只有把函数当 成构造函数来创建对象时, 这个原型属性才有用
  28. ///////////////////////////////////////////////////
  29. // 静态成员
  30. // 静态成员直接挂载到构造函数上面
  31. We.w555 = "jingjng";
  32. console.log(We.w555);
  33. // 类与对象,糊里糊涂,意思就是先使用函数创建一个类,这类公共可以随便使用,然后这个函数封包成了声明的字段,通过声明的字段可以随便修改函数内的对象
  34. // 通过.prototype对声明的函数添加一个自定义方法,用户可以随便调用,挂载静态成员直接追加即可
  35. //////////////////es6系列//////////////////////////
  36. // es6 class
  37. // class就已经包含了上面所有的
  38. // 先声明一个公共字段
  39. class Pr {
  40. // 先声明两个公共字段
  41. name = "username";
  42. email = "useremail@email.com";
  43. // 私有成员使用#来代表//
  44. #gender = "male";
  45. // 构造方法 再es6中自带的语法constructor 程序自带的类似set get fun等
  46. constructor(name, email, sex) {
  47. this.name = name;
  48. this.email = email;
  49. this.#gender = sex;
  50. }
  51. // 公共方法:原型;
  52. getInfo() {
  53. return `name = ${this.name}, email = ${this.email}, sex = ${this.#gender}`;
  54. }
  55. // 静态成员语法static,也是程序自带的
  56. static status = "enabled";
  57. }
  58. // new构造函数使用的执行字段,不是构造函数不能使用
  59. const user4 = new Pr("朱老师", "zhulaoshi@php.cn", "男");
  60. // 这里还是使用公共方法原型调用,
  61. console.log(user4.getInfo());
  62. // es6中,所有的公共字段以及构造方法,私有属性,构造方法,公共方法原型,公共方法原型也就是.prototype,包括静态成员,都放到了class内
  63. ///////////////////////
  64. //(子类)继承 为了扩展
  65. /////////////////////
  66. // 创建一个子类,名字叫Child 继承于Wewq (extends)程序自带的继承的意思
  67. class Child extends Pr {
  68. // 继承的构造器,需要从父函数里面拿一下
  69. constructor(name, email, sex, salary) {
  70. // 继承自父级,构造器可以直接继承,继承的代码为
  71. super(name, email, sex);
  72. // super程序自带的,也是简便下面的代码,继承父级,然后把构造器里面的三个对象(属性)拿过来,相当于引用了第51行代码
  73. // this.name = name;
  74. // this.email = email;
  75. // this.#gender = sex;
  76. // 刚刚又添加了一个对象(属性)叫做salary
  77. this.salary = salary;
  78. }
  79. getInfo() {
  80. // return `name = ${this.name}, email = ${this.email}, sex = ${this.#gender}`;其实就是继承第58行的getInfo公共方法
  81. //直接用super继承第58行的get方法,使用模板字符串,所以要加${},然后自定义属性salary上追加上去
  82. return `${super.getInfo()},salary = ${this.salary}`;
  83. }
  84. }
  85. // 直接调佣子类的名字Child
  86. const user5 = new Child("灭绝", "mj@php.cn", "女", 12345676);
  87. // 把新加的子类声明到user5中,然后打印
  88. console.log(user5.getInfo());
  89. class Stu {
  90. #age = 0;
  91. get age() {
  92. return this.#age;
  93. }
  94. set age(age) {
  95. if (age >= 18 && age <= 120) {
  96. this.#age = age;
  97. } else {
  98. console.log("非法数据");
  99. }
  100. }
  101. }
  102. let stu = new Stu();
  103. console.log(stu.age);
  104. stu.age = 40;
  105. console.log(stu.age);
解构赋值
  1. // 解构赋值
  2. // 声明一个变量
  3. const name = ["老卢", "123456"];
  4. // 声明了一个数组
  5. let username = name[0];
  6. let useremail = name[1];
  7. console.log(username, useremail);
  8. // es6解构赋值 模板=数组
  9. // es6: 解构, 将以上操作变得非常简单
  10. // 1. 数组解构
  11. // 模板 = 数组
  12. let [name2, email] = ["laolu", "123456@qq.com"];
  13. console.log(name2, email);
  14. // 参数不足情况下
  15. let [name3, email3, user3 = 0] = ["laolu", "123456@qq.com"];
  16. console.log(name3, email3, user3);
  17. // 参数不足的情况下,在默认参数增加一个值
  18. // 参数过多
  19. let [name4, email4, ...user4] = ["laolu", "123456@qq.com", "666", "7777", "88888"];
  20. console.log(name4, email4, user4);
  21. // 两组交换
  22. let x = 1;
  23. let y = 2;
  24. console.log(x, y);
  25. [y, x] = [x, y];
  26. console.log(x, y);
  27. // 对象解构
  28. // 对象模板 = 对象字面量;
  29. let { name5, name6, name7, name8 } = { name5: "666", name6: "777", name7: "888", name8: "999" };
  30. console.log(name5, name6, name7, name8);
  31. // 二次复用 在外层加个()
  32. ({ id, lesson, score } = { id: 2, lesson: "node", score: 90 });
  33. console.log(id, lesson, score);
  34. // 当左边模板中的变量出现命名冲突,使用别名解决,在原有的基础上加上:别名,
  35. let { id: userId, lesson: userLesson, score: userScore } = { id: 3, lesson: "vue", score: 50 };
  36. // 输出的时候也需要用别名
  37. console.log(userId, userLesson, userScore);
  38. // 克隆对象使用...
  39. let { ...obj } = { id: 1, lesson: "js", score: 80 };
  40. console.log(obj);
  41. // 3. 应用场景(第一种写法)
  42. function getUser(user) {
  43. console.log(user.id, user.name, user.email);
  44. }
  45. // 用对象解构传参(第二种写法,感觉就像函数的传统解法)
  46. function getUser({ id, name, email }) {
  47. console.log(id, name, email);
  48. }
  49. getUser({ id: 123, name: "张三", email: "zs@php.cn" });
浏览器的js,与dom操作控制html页面
时间太紧迫,先贴代码,回头回来整理

下面是js,操作dom操作
html代码:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>解析一个浏览器按钮事件</title>
  7. </head>
  8. <body>
  9. <style>
  10. button {
  11. border: 0px;
  12. background-color: green;
  13. color: honeydew;
  14. padding: 4px;
  15. cursor: pointer;
  16. }
  17. button:hover {
  18. border: 0px;
  19. background-color: orange;
  20. color: blue;
  21. padding: 4px;
  22. cursor: pointer;
  23. }
  24. </style>
  25. <button onclick="qd(this)">开始签到</button>
  26. <script>
  27. function qd(ele) {
  28. // 意思是html页面body的style属性的backgroundColor背景颜色改为米色
  29. document.body.style.backgroundColor = "wheat";
  30. ele.style.backgroundColor = "yellow";
  31. ele.style.color = "blue";
  32. ele.textContent = "签到成功";
  33. }
  34. </script>
  35. </body>
  36. </html>

操作的第二段代码:

  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  6. <title>示例演示dom操作2</title>
  7. </head>
  8. <ul class="list">
  9. <li class="li">测试看看</li>
  10. <li class="li">测试看看</li>
  11. <li class="li">测试看看</li>
  12. <li class="li">测试看看</li>
  13. <li class="li">测试看看</li>
  14. </ul>
  15. <!-- TODO 1. 一组: querySelectorAll(css选择器)
  16. TODO 2. 一个(一组中第1个): querySelector(css选择器) -->
  17. <script>
  18. // document代表html文档
  19. console.log(document);
  20. const items = document.querySelectorAll(".list>.li");
  21. console.log(items);
  22. for (let i = 0, length = items.length; i < length; i++) {
  23. items[i].style.color = "blue";
  24. }
  25. </script>
  26. <script>
  27. // TODO 1. 一组: querySelectorAll(css选择器)
  28. // TODO 2. 一个(一组中第1个): querySelector(css选择器)
  29. // 1. 将所有的item变成红色
  30. // html怎么表示?
  31. console.log(document);
  32. const items = document.querySelectorAll(".list > .li");
  33. console.log(items);
  34. for (let i = 0, length = items.length; i < length; i++) {
  35. items[i].style.color = "red";
  36. }
  37. // items.forEach(item => (item.style.color = "green"));
  38. // 2. 将第一个改为黄色背景
  39. const first = document.querySelector(".list > .li");
  40. console.log(first === items[0]);
  41. first.style.backgroundColor = "yellow";
  42. const three = document.querySelector(".list > .li:nth-of-type(3)");
  43. three.style.backgroundColor = "wheat";
  44. // 3. 快捷方式
  45. // body
  46. console.log(document.querySelector("body"));
  47. console.log(document.body);
  48. //head
  49. console.log(document.head);
  50. // title
  51. console.log(document.title);
  52. // html
  53. console.log(document.documentElement);
  54. </script>
  55. <body></body>
  56. </html>