Skip to content

Object(对象)

创建对象

1. 对象字面量

javascript
const person = {
    name: 'John',
    age: 30,
    greet() {
        console.log(`Hello, I'm ${this.name}`);
    }
};

2. 构造函数

javascript
function Person(name, age) {
    this.name = name;
    this.age = age;
    this.greet = function() {
        console.log(`Hello, I'm ${this.name}`);
    };
}
const person = new Person('John', 30);

3. Object.create()

javascript
const personPrototype = {
    greet() {
        console.log(`Hello, I'm ${this.name}`);
    }
};
const person = Object.create(personPrototype);
person.name = 'John';
person.age = 30;

对象属性

1. 属性描述符

javascript
const person = {
    name: 'John'
};

Object.defineProperty(person, 'age', {
    value: 30,
    writable: true,
    enumerable: true,
    configurable: true
});

2. 访问器属性

javascript
const person = {
    firstName: 'John',
    lastName: 'Doe',
    get fullName() {
        return `${this.firstName} ${this.lastName}`;
    },
    set fullName(value) {
        [this.firstName, this.lastName] = value.split(' ');
    }
};

对象方法

1. 静态方法

  • Object.keys(): 返回对象自身可枚举属性的键名数组
  • Object.values(): 返回对象自身可枚举属性的值数组
  • Object.entries(): 返回对象自身可枚举属性的键值对数组
  • Object.assign(): 用于对象合并
  • Object.freeze(): 冻结对象,使其不可修改
  • Object.seal(): 封闭对象,使其属性不可配置

2. 实例方法

  • hasOwnProperty(): 判断对象是否具有指定的自身属性
  • toString(): 返回对象的字符串表示
  • valueOf(): 返回对象的原始值

原型与继承

1. 原型链

javascript
function Animal(name) {
    this.name = name;
}
Animal.prototype.speak = function() {
    console.log(`${this.name} makes a sound.`);
};

function Dog(name) {
    Animal.call(this, name);
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;

2. 类语法(ES6+)

javascript
class Animal {
    constructor(name) {
        this.name = name;
    }
    speak() {
        console.log(`${this.name} makes a sound.`);
    }
}

class Dog extends Animal {
    constructor(name) {
        super(name);
    }
    speak() {
        console.log(`${this.name} barks.`);
    }
}

最佳实践

  1. 使用对象字面量创建简单对象
  2. 使用类语法实现面向对象编程
  3. 优先使用组合而不是继承
  4. 使用 Object.freeze() 创建不可变对象
  5. 使用 Symbol 作为私有属性键
  6. 使用 getter 和 setter 控制属性访问

常见问题

  1. 对象引用与浅拷贝/深拷贝
  2. this 关键字的作用域
  3. 原型链污染
  4. 对象属性枚举顺序
  5. 对象解构与展开运算符的使用