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

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

程序员文章站 2022-05-16 21:26:52
...

闭包

首先先来了解一个概念

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

  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标签内容