Js-高级对象

5 阅读1分钟

1. 方法所属的对象被称为调用对象(Calling Object)

  • 意思:当你调用一个方法时,方法当前所属的对象就叫调用对象。
  • 示例
    const robot = {
      model: '1X',
      greet() {          // ← 这个方法属于 robot 对象
        console.log(this.model);  // this 就是调用对象
      }
    };
    robot.greet();  // 调用对象是 robot
    

2. this 关键字

  • 作用:指代调用对象,让你在方法内部访问对象的属性。
  • 关键this 的值取决于调用位置,而不是定义位置。
  • 示例
    const cat = {
      name: '小花',
      speak() {
        console.log(`我是${this.name}`);  // this 指向 cat
      }
    };
    cat.speak();  // 输出:我是小花
    

3. 方法不会自动获得调用对象其他内部属性的访问权限

  • 意思:方法内部如果想用对象的其他属性,必须通过 this,不能直接写属性名。
  • 错误示例(常见新手坑):
    const obj = {
      x: 10,
      double() {
        return x * 2;  // ❌ 这里 x 是 undefined!
      }
    };
    
  • 正确写法:必须写 this.x

4. this 的值取决于访问 this 的位置

  • 普通函数 / 方法 → this 指向调用它的对象
  • 箭头函数 → this 继承外层作用域(词法作用域)

5. 不能用箭头函数作为方法(如果需要访问内部属性)

  • 箭头函数没有自己的 this,会往外层找。
  • 错误示例
    const robot = {
      model: '1X',
      greet: () => {          // ❌ 箭头函数
        console.log(this.model);  // this 是 undefined 或 window
      }
    };
    
  • 正确:用普通函数 greet() {}

6. JavaScript 对象没有内置隐私机制

  • 对象属性默认都是公开的,谁都能改。
  • 但开发者有约定俗成的规则来“暗示”隐私。

7. 属性名前加下划线 _ 表示不希望被直接修改

  • 这是业界最常见的隐私约定(不是真正的 private)。
  • 示例:
    const bankAccount = {
      _balance: 1000,           // 别人不应该直接改这个
      getBalance() {
        return this._balance;
      }
    };
    

8. Setter 和 Getter 方法

  • 提供更安全、可控的属性访问方式。
  • 示例:
    const person = {
      _age: 25,
      get age() {                // getter
        return this._age;
      },
      set age(newAge) {          // setter(可加校验)
        if (newAge > 0) this._age = newAge;
      }
    };
    person.age = 30;   // 自动调用 setter
    console.log(person.age);  // 自动调用 getter
    

9. 工厂函数(Factory Function)

  • 用来批量快速创建多个相似对象。
  • 示例:
    function createRobot(model, energy) {
      return {
        model,
        energy,
        greet() {
          console.log(`我是${this.model}`);
        }
      };
    }
    const r1 = createRobot('1X', 100);
    const r2 = createRobot('2Y', 200);
    

10. 对象解构(Object Destructuring)

  • 两种常用方式
    1. 属性值简写(Property Value Shorthand):
      const name = '小明';
      const age = 18;
      const student = { name, age };  // 自动变成 {name: '小明', age: 18}
      
    2. 解构赋值
      const { model, energy } = robot;   // 一次性取出多个属性
      const { model: robotModel } = robot;  // 重命名
      

快速记忆口诀(方便背):

  • 方法里想用属性 → 必须 this
  • 箭头函数不能当方法 → 因为 this 失效
  • 隐私 → 用 _ 下划线约定
  • 安全访问 → getter / setter
  • 批量造对象 → 工厂函数
  • 快速取值 → 对象解构