博客列表 >js 访问器属性、构造函数、解构赋值

js 访问器属性、构造函数、解构赋值

Wu.Ang
Wu.Ang原创
2022年08月21日 23:24:48533浏览

js 访问器属性、构造函数、解构赋值

访问器属性

1.对象字面量声明

一次性添加

  1. let item = {
  2. // 添加data,结构更清晰
  3. data: {
  4. name: "手机",
  5. num: 2,
  6. price: 5000,
  7. },
  8. };
  9. console.log(item.data);

逐个追加

  1. let item = {};
  2. item.data = {};
  3. item.data.name = "电脑";
  4. item.data.price = 6000;
  5. console.log(item.data);
  6. // 读操作
  7. item.getPrice = function () {
  8. return this.data.price;
  9. };
  10. // 写操作
  11. item.setPrice = function (value) {
  12. this.data.price = value;
  13. };
  14. console.log(item.getPrice());
  15. item.setPrice(2000);
  16. console.log(item.getPrice());

2.访问接口 : 可以做数据验证

  1. let item = {
  2. data: {
  3. name: "手机",
  4. price: 5000,
  5. },
  6. // ===============访问接口===================================
  7. // 读操作
  8. getPrice() {
  9. return this.data.price;
  10. },
  11. // 写操作
  12. setPrice(value) {
  13. this.data.price = value;
  14. },
  15. // =================================================
  16. };
  17. console.log(item.data);
  18. console.log(item.getPrice());
  19. item.setPrice(5500);
  20. console.log(item.getPrice());

数据验证

  1. let item = {};
  2. item.data = {};
  3. item.data.name = "电脑";
  4. item.data.price = 6000;
  5. console.log(item.data);
  6. // 读操作
  7. item.getPrice = function () {
  8. return this.data.price;
  9. };
  10. // 写操作
  11. item.setPrice = function (value) {
  12. // 如果价格小于等于0,返回false
  13. if (value <= 0) return false;
  14. this.data.price = value;
  15. };
  16. console.log(item.getPrice());
  17. item.setPrice(-2000);
  18. console.log(item.getPrice());

3.接口属性化

  1. let item = {
  2. data: {
  3. name: "电脑",
  4. price: 3000,
  5. },
  6. // name读操作
  7. get name() {
  8. return this.data.name;
  9. },
  10. // price读操作
  11. get price() {
  12. return this.data.price;
  13. },
  14. };
  15. // =============================================
  16. console.log(`${item.data.name} : ${item.data.price}`);
  17. console.log(`${item.name} : ${item.price}`);

构造函数 : 专用于创建对象(实例)的函数

1.自有成员

  1. // 构造函数,必须要用new来调用
  2. let User = function (name, price) {
  3. // 直接在函数中用this引用这个空对象
  4. // 为这个新对象添加属性或方法
  5. this.name = name;
  6. this.price = price;
  7. // this指向,没有指向新对象,而是指向全局
  8. };
  9. // new,会自动把当前的this指向新对象
  10. let user = new User("手机", 6000);
  11. console.log(user);

2.共享成员

  1. let User = function (name, price) {
  2. // 自有属性 : 用来区分不同对象
  3. this.name = name;
  4. this.price = price;
  5. // 共享方法 : 调用的方法完全相同
  6. this.getInfo = function () {
  7. return `商品:${this.name},价格:${this.price}`;
  8. };
  9. };
  10. let user = new User("手机", 6000);
  11. console.log(user);
  12. // 两个对象的属性不同,但方法完全相同,造成了代码冗余
  13. // 多余的方法, 实际上应该是被左右实例所共享, 只需要保留一个方法父本
  14. // 查看对象的构造器(构造函数)
  15. console.log(user.constructor === User); // 结果返回true
  16. console.dir(User); //可以看到函数更多的细节
  17. // 所有函数都有一个原型属性prototype
  18. // 这个原型属性,对于普通函数来说, 没啥用
  19. // 但是对于构造函数来说,极其有用
  20. // 构造函数原型属性的成员, 可以被该构造函数的所有实例所共享
  21. // -------------------------------------------------------------------
  22. let User1 = function (name, price) {
  23. this.name = name;
  24. this.price = price;
  25. };
  26. // 将对象的共享成员挂载到原型属性
  27. User1.prototype.getInfo = function () {
  28. return `商品:${this.name},价格:${this.price}`;
  29. };
  30. let user1 = new User1("手机", 6000);
  31. let user2 = new User1("电脑", 8000);
  32. console.log(user1, user2);

3.私有成员

  1. let User = function (name, price) {
  2. this.name = name;
  3. this.price = price;
  4. // 私有成员
  5. let remarks = "数码产品";
  6. };

4.静态成员 :当前的属性或方法,只能通过构造函数访问,不能用实例访问

  1. let User = function (name, price) {
  2. this.name = name;
  3. this.price = price;
  4. };
  5. // 静态成员
  6. // 函数也是对象, 是对象就可以添加属性
  7. User.nation = "中国";
  8. // 只能用当前构造器访问
  9. console.log(User.nation);

5.继承 : 基于’原型’实现继承

  1. // 父级构造函数
  2. let Parent = function () {};
  3. Parent.prototype.sum = function () {
  4. return this.a + this.b;
  5. };
  6. // 子类构造器
  7. let Sun = function (a, b) {
  8. this.a = a;
  9. this.b = b;
  10. };
  11. Sun.prototype = Parent.prototype;
  12. let sun = new Sun(10, 20);
  13. console.log(sun.sum());

用类(就是函数)简化构造函数 ES6 中可以用

声明 : class Demo {}

构造方法和共享成员不能加分号

  1. // class 声明类
  2. class Demo {
  3. // 公共成员
  4. username = "数码";
  5. // 构造方法,实例初始化
  6. constructor(name, price) {
  7. this.name = name;
  8. this.price = price;
  9. }
  10. // 公享成员
  11. getInfo() {
  12. return `${this.name} : ${this.price}`;
  13. }
  14. // 静态成员
  15. static status = "123";
  16. }
  17. let demo = new Demo("电视", 20000);
  18. console.log(demo.getInfo());
  19. // 访问静态成员
  20. console.log(Demo.status);

继承

  1. // 父类
  2. class Demo {
  3. // 构造方法,实例初始化
  4. constructor(name, price) {
  5. this.name = name;
  6. this.price = price;
  7. }
  8. // 公享成员
  9. getInfo() {
  10. return `名称:${this.name},价格:${this.price}元`;
  11. }
  12. }
  13. // 子类
  14. // extends 继承
  15. class Demo2 extends Demo {
  16. constructor(name, price, num) {
  17. // super()会自动的调用父级的构造器来初始化该实例
  18. super(name, price);
  19. this.num = num;
  20. }
  21. // 子类中对父级的方法进行扩展
  22. getInfo() {
  23. return `${super.getInfo()},数量是${this.num}台`;
  24. }
  25. }
  26. let demo2 = new Demo2("电视", 30000, 20);
  27. console.log(demo2.getInfo());

解构赋值

1.数组解构

  1. let user = ["张三", 25];
  2. // 数组解构 模板=值
  3. let [username, age] = ["张三", 25];
  4. console.log(username, age);
  5. // 更新
  6. [username, age] = ["李四", 25];
  7. console.log(username, age);
  8. // 参数不足:默认值
  9. [username, age, sex = "男"] = ["李四", 25];
  10. console.log(username, age, sex);
  11. // 参数过多
  12. let [a, b, c, ...arr] = [1, 2, 3, 4, 5];
  13. console.log(a, b, c);
  14. console.log(...arr);

用途 : 两数交换

  1. let x = 10;
  2. let y = 20;
  3. [y, x] = [x, y];
  4. console.log(x, y);

2.对象解构

  1. let { name, age } = { name: "Wang", age: 25 };
  2. console.log(name, age);

更新

  1. let { name, age } = { name: "Wang", age: 25 };
  2. console.log(name, age);
  3. // 更新 必须要用 '()' 包住内容
  4. ({ name, age } = { name: "Wang", age: 23 });
  5. console.log(name, age);

模板冲突

  1. let { id, name, age } = { id: 1, name: "Wang", age: 25 };
  2. console.log(id, name, age);
  3. // 如果左边模板中变量存在明明冲突 : 起别名
  4. let { id: sex_id, sex } = { id: 1, sex: "男" };
  5. console.log(sex_id, sex);

用途 : 使用对象的解构来优化函数的声明

  1. let user = { id: 1, name: "Wang", age: 25, sex: "男" };
  2. function getUser({ id, name, age, sex }) {
  3. console.log(id, name, age, sex);
  4. }
  5. getUser(user);
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议