博客列表 >闭包/访问器属性/类与对象/解构赋值/js引入与获取DOM对象

闭包/访问器属性/类与对象/解构赋值/js引入与获取DOM对象

向日葵
向日葵原创
2022年01月10日 18:56:08470浏览

闭包

首先先来了解一个概念

自由变量:全局中声明的变量,独立在函数外面的变量;

  1. // 自由变量
  2. let num = 123;
  3. // 参数变量:a,b
  4. // 内部变量:c
  5. // 以上统称为私有属性;函数外不不可访问
  6. // num相对于函数来说是函数外部声明的,叫做自由变量。
  7. let fn = (a, b) => { let c = 10; return a + b + c + num };
  8. let f = fn(1, 2);
  9. console.log(f);//136

闭包函数

  1. // 闭包函数
  2. // 1.父子函数
  3. // 2.子函数调用了父函数中的变量
  4. // 3.返回子函数
  5. fn = function (a, b) {
  6. let f1 = function (c) {
  7. return a + b + c;
  8. }
  9. return f1;
  10. }
  11. console.log(fn(4, 5)(9));// 18

偏函数(高阶函数)

当一个函数需要多个参数且不是一次性传入时,可以进行分批传入

可以分层传递参数,一层传一个

  1. let fn2 = function (a) {
  2. let ff1 = function (b) {
  3. let ff2 = function (c) {
  4. return a + b + c;
  5. }
  6. return ff2;
  7. }
  8. return ff1;
  9. }
  10. let res = fn2(1);
  11. console.log(typeof res);//function
  12. let res1 = res(2);
  13. console.log(typeof res1);//function
  14. let res2 = res1(3);
  15. console.log(res2);//6
  16. //简写:将参数逐个传入——柯里化传参
  17. fn2 = a => b => c => a + b + c;
  18. console.log(fn2(2)(3)(8));//13

反闭包函数——纯函数: 不使用外部变量,参数全是自己的,若要使用就当参数传进来

  1. let discount = 0.9;
  2. let getPrice = (price, discount = 1) => price * discount;
  3. console.log(getPrice(100));//100
  4. console.log(getPrice(100, discount));//90

访问器属性

正常我们调用对象的属性和给对象属性赋值的时候是这么写的:

  1. let user = {
  2. data: { "user": "zhangsan", "email": "zhangsan@163.com" },
  3. getemail() {
  4. return this.data.email;
  5. },
  6. setemail(email) {
  7. this.data.email = email;
  8. }
  9. }
  10. console.log(user.getemail());
  11. user.setemail('myemial@123.com');
  12. console.log(user.getemail());

我们把对象中的方法伪装成属性来调用:

  1. // 进行属性伪装,把函数伪装成属性进行调用和赋值
  2. //访问器属性:看上去访问的是属性,其实是方法
  3. let username = {
  4. data: { "name": "zhangsan", "age": 20 },
  5. get age() {
  6. return this.data.age;
  7. },
  8. set age(age) {
  9. if (age >= 18 && age <= 100) {
  10. this.data.age = age;
  11. } else {
  12. console.log("非法");
  13. }
  14. }
  15. }
  16. console.log(username.data.age);//20
  17. username.age = 90;//赋值,自动调用set方法
  18. console.log(username.data.age);//90

类与对象

  1. // 构造函数:创建对象专用,当一个函数是一个构造函数时,他的首字母要大写
  2. let User = function (name, emial) {
  3. this.name = name;
  4. this.emial = emial;
  5. }
  6. //实例化一个类
  7. let user = new User('zs', 'zs@123.com');
  8. console.log(user);//User { name: 'zs', emial: 'zs@123.com' }
  9. // 对象方法一般是公共的,添加对象方法需要添加在构造方法的原型上,即User.prototype,声明在User.prototype上的方法,被所有实例化的对象公用
  10. User.prototype.getInfo = function () {
  11. return `name:${this.name},emial:${this.emial}`;
  12. }
  13. console.log(user.getInfo());//name:zs,emial:zs@123.com 
  14. // 静态成员,直接挂载到构造函数对象上的属性
  15. User.status = 'enabled';
  16. console.log(User.status);//可以直接被调用,输出enabled
  17. // 私有成员:函数接收参数的名称不能和私有变量名称重复
  18. User = function (user, mobile, add) {
  19. let address = '';//构造函数中声明的变量是私有变量
  20. this.user = user;
  21. this.mobile = mobile;
  22. this.address = add;
  23. }
  24. User.prototype.getInfo = function () {
  25. return `name:${this.name},mobile:${this.mobile},address:${this.address}`;
  26. }
  27. let user1 = new User('ls', '18888888888', '北京');
  28. console.log(user1.address);//北京
  29. console.log(user1.getInfo());//name:ls,mobile:18888888888,address:北京 
  30. // ES6以后 类的写法
  31. class Parent {
  32. name = 'zs';
  33. mobile = '139111111111';
  34. address = 'bj';
  35. // 私有成员
  36. #gender = 'male';
  37. //ES7 静态成员
  38. static type = 'nomal';
  39. //构造方法——初始化变量
  40. constructor(name, mobile, sex, address) {
  41. this.name = name;
  42. this.mobile = mobile;
  43. this.#gender = sex;
  44. this.address = address;
  45. }
  46. // 公共方法
  47. getInfo() {
  48. console.log(this.type);
  49. return `name:${this.name},mobile:${this.mobile},address:${this.address},sex:${this.#gender}`;
  50. }
  51. }
  52. const user2 = new Parent('ls', '17000000000', '1', 'jn');
  53. //静态变量直接用类名.变量名来调用
  54. console.log(user2.getInfo() + `,type:${Parent.type}`);

类的继承

  1. class Son extends Parent {
  2. //类中的变量声明不用加修饰符
  3. myEmial = 'zs@qq.com';
  4. constructor(name, mobile, sex, address, emial) {
  5. // 实现父类中的构造函数
  6. super(name, mobile, sex, address);
  7. //子类中自己的成员
  8. this.myEmial = emial;
  9. }
  10. getInfo() {
  11. //重写父类中的方法
  12. return `emial:${this.myEmial},` + super.getInfo();
  13. }
  14. age = 10;
  15. // 类中可以使用访问器属性
  16. get age() {
  17. return this.age;
  18. }
  19. set age(age) {
  20. if (age >= 18 && age <= 130) {
  21. this.age = age;
  22. } else {
  23. console.log("错咯~");
  24. }
  25. }
  26. }
  27. const lilei = new Son('lilei', '13111111111', '1', '上海', 'lilei@qq.com');
  28. console.log(lilei.getInfo());
  29. console.log(lilei.age);//10
  30. lilei.age = 110;
  31. console.log(lilei.age);//110

解构赋值

数组解构

  1. //正常我们去定义一个数组时:
  2. let user = ['zs', '123456'];
  3. let uname = user[0];
  4. let uqq = user[1];
  5. console.log(uname);//zs
  6. //数组解构
  7. // [模板]=[数组]
  8. [uname, uqq] = ['hanmeimei', '1234567890'];
  9. console.log(uname);//hanmeimei
  10. //参数不足时:给默认值
  11. let [id, name, time = 2] = [1, 'xiaohua'];
  12. console.log(id, name, time);//1 xiaohua 2
  13. //参数过多时:...rest
  14. let [a, b, c, ...d] = [1, 2, 3, 4, 5, 6, 7];
  15. console.log(d);//[4,5,6,7]
  16. // 两数交换
  17. let x = 10; y = 20;
  18. [y, x] = [x, y];
  19. console.log(x, y);//20 10

对象解构

  1. // 对象解构
  2. let obj = { id: 1, name: "xiaoming", age: 18 };
  3. //对象模板=对象字面量 但是{}不能作为=左边的值,所以转化为一个表达式({}) = {},
  4. ({ id, name, age }) = { id: 1, name: "xiaoming", age: 18 };
  5. console.log(id, name, age);//1 xiaoming 18
  6. ({ id, name, age }) = { id: 2, name: "xiaogang", age: 20 };
  7. console.log(id, name, age);//2 xiaogang 20
  8. //命名冲突(重复)时,使用别名
  9. let { id: uid, name: username, age: uage } = { id: 3, name: "小刘", age: 19 };
  10. console.log(uid, username, uage);//3 小刘 19
  11. // 克隆对象: ...rest
  12. let { ...obj1 } = { id: 3, name: "小刘", age: 19 };
  13. console.log(obj1);//{ id: 3, name: "小刘", age: 19 }
  14. // 应用场景:函数参数为一个对象时,我们可以利用解构对象参数的方式,简单传参,然后函数中直接调用参数值
  15. function getUserInfo(user) {
  16. return `${user.id} , ${user.name}`;
  17. }
  18. console.log(getUserInfo({ id: 4, name: 123 }));//4,123
  19. //对象解构传参{对象属性},调用时直接传一个对象即可
  20. function getUserInfo1({ id, name }) {
  21. return `${id},${name}`;
  22. }
  23. console.log(getUserInfo1({ id: 2, name: "zhangsan" }));//2 zhangsan

js引入与获取DOM对象

引入外部js:

  1. <script src="out.js"></script>

获取DOM对象

  1. <ul class="list">
  2. <li class="items">item1</li>
  3. <li class="items">item2</li>
  4. <li class="items">item3</li>
  5. <li class="items">item4</li>
  6. <li class="items">item5</li>
  7. <li class="items1">item6</li>
  8. </ul>

以上一组列表,获取全部用document.querySelectorAll(css选择器名称);
获取第一个使用document.querySelector(css选择器名称)
例如:

  1. // 获取一组 querySelectorAll(选择器)
  2. console.log(document);
  3. // 获取所有的li
  4. console.log(document.querySelectorAll('li'));
  5. //获取当前类选择器的li——NodeList——类数组
  6. console.log(document.querySelectorAll('.list > .items'));
  7. // 获取一个(一组中的第一个) querySelector
  8. let one = document.querySelector('.list > .items');
  9. console.log(one);
  10. one.style.color='red';//给第一个红色字体
  11. // 获取第三个
  12. let three = document.querySelector('.list > .items:nth-of-type(3)');
  13. three.style.backgroundColor='green';//给第三个添加绿色背景

经常试用到的快捷方式有:

写法 释义
document.bodydocument.querySelectorAll('body') 获取当前页面的body
document.head 获取当前页面的<head></head>标签
document.title 获取当前页面的title标签内的文本
document.documentElement 获取当前页面的html标签内容
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议