JavaScript

JavaScript 知识量:26 - 101 - 483

7.2 创建对象><

工厂模式- 7.2.1 -

工厂模式是一种在JavaScript中创建对象的设计模式,它提供了一种方法来创建对象,而不必显式地指定它们的类。工厂模式可以用来创建具有相同接口但具有不同实现的对象。

以下是一个简单的工厂模式示例:

function createObject(type) {  
  switch(type) {  
    case 'person':  
      return {  
        type: 'person',  
        name: 'John',  
        age: 30  
      };  
    case 'car':  
      return {  
        type: 'car',  
        brand: 'Toyota',  
        color: 'red'  
      };  
    default:  
      throw new Error('Invalid object type');  
  }  
}  
  
let obj = createObject('person');  
console.log(obj);  // 输出:{ type: 'person', name: 'John', age: 30 }  
  
obj = createObject('car');  
console.log(obj);  // 输出:{ type: 'car', brand: 'Toyota', color: 'red' }

在上面的示例中,createObject函数是一个工厂函数,它根据传入的类型参数创建并返回一个对象。在这种情况下,可以创建不同类型的对象,例如人或汽车,每个对象都有自己的属性和类型。

构造函数模式- 7.2.2 -

可以使用构造函数模式来创建对象。构造函数是一个特殊的函数,用于初始化一个新创建的对象。在JavaScript中,所有的函数都有一个prototype属性,这个属性是一个指向该函数创建的所有实例的链。当一个对象被创建时,它的__proto__属性会指向构造函数的prototype对象。

以下是一个基本的构造函数模式示例:

function Person(name, age) {  
  this.name = name;  
  this.age = age;  
}  
  
let john = new Person('John', 30);  
console.log(john);  // 输出:{ name: 'John', age: 30 }

在这个示例中,Person是一个构造函数,它有两个参数:name和age。当创建一个新的Person对象时,this关键字用来指向新创建的对象,然后将name和age属性添加到这个新对象上。

注意:在JavaScript中,使用new关键字和构造函数来创建对象是很常见的,但这并不是必须的。如果只是调用函数,而没有使用new关键字,JavaScript会自动创建一个新的空对象作为this,并把这个新对象的__proto__链接到构造函数的prototype上。

function Person(name, age) {  
  this.name = name;  
  this.age = age;  
}  
  
let john = Person('John', 30);  // 同样可以创建一个Person对象

然而,使用new关键字可以让代码更加清晰,明确地表示正在创建一个新的对象实例。

原型模式- 7.2.3 -

原型模式也是一种创建对象的方式。通过将一个对象的原型设置为另一个对象,可以使新创建的对象从另一个对象继承属性和方法。

以下是一个基本的原型模式示例:

// 定义一个原型对象  
let Person = {  
  name: "Unknown",  
  age: 0,  
  hello: function() {  
    console.log(`Hello, my name is ${this.name}`);  
  }  
};  
  
// 创建一个新对象  
let john = Object.create(Person);  
john.name = "John";  
john.age = 30;  
  
// 调用继承的方法  
john.hello();  // 输出:Hello, my name is John

在这个示例中,定义了一个Person原型对象,它具有name、age和hello方法。然后使用Object.create()方法创建了一个新的对象john,并将Person作为它的原型。这样,john就可以从Person原型对象继承属性和方法。为john设置了name和age属性,并调用了hello方法。

在 JavaScript 中,所有的对象都有一个指向其原型的内部链接。当创建一个新对象时,这个新对象的原型(也就是它的__proto__属性)就会被设置为构造函数的prototype对象。通过这种方式,所有的对象都可以从其构造函数的原型继承属性和方法。

对象迭代- 7.2.4 -

迭代对象属性可以使用Object.values()和Object.entries()。Object.values()和Object.entries()是JavaScript中Object对象的两个方法,它们用于从对象中提取数据。

1. Object.values():用于返回一个由对象的所有值组成的数组,其排列与用枚举器(如for...in循环)按属性序数索引的顺序相对应。例如:

let obj = {   
    "name": "John",   
    "age": 30,   
    "city": "New York"   
};  
  
console.log(Object.values(obj));   
// 输出:[ 'John', 30, 'New York' ]

2. Object.entries():用于返回一个由对象的键值对数组组成的结果,其中每个数组的两个元素分别对应于对象的键和值。例如:

let obj = {   
    "name": "John",   
    "age": 30,   
    "city": "New York"   
};  
  
console.log(Object.entries(obj));   
// 输出:[ [ 'name', 'John' ], [ 'age', 30 ], [ 'city', 'New York' ] ]

每个键值对数组的两个元素分别是对象的键和值。因此,如果希望在迭代过程中同时获取键和值,那么Object.entries()就很有用。如果只需要对象的值,那么使用Object.values()会更方便。