面试必学,你知道有哪些创建对象的方式吗?

53 阅读2分钟

创建对象的方式有哪些,这里列举几个常见的

在JavaScript中,对象可以通过多种方式创建。以下是一些常见的方法及其示例:

  1. 字面量方式

使用对象字面量是最常见也是最简单的方式来创建对象。

let obj1 = {  
    name: "Alice",  
    age: 30,  
    sayHello: function() {  
        console.log("Hello, I'm " + this.name);  
    }  
};
  1. 构造函数方式

构造函数是一个特殊的函数,通常用于初始化一个新创建的对象。

function Person(name, age) {  
    this.name = name;  
    this.age = age;  
    this.sayHello = function() {  
        console.log("Hello, I'm " + this.name);  
    };  
}  
  
let obj2 = new Person("Bob", 25);

注意:上面的例子中,sayHello方法被定义在每个实例上,这可能会导致内存浪费。通常,我们会将方法定义在构造函数原型上,以共享方法。

Person.prototype.sayHello = function() {  
    console.log("Hello, I'm " + this.name);  
};
  1. Object.create() 方法

使用Object.create()方法创建一个新对象,使用现有的对象来提供新创建的对象的__proto__

let proto = {  
    sayHello: function() {  
        console.log("Hello, I'm " + this.name);  
    }  
};  
  
let obj3 = Object.create(proto);  
obj3.name = "Charlie";  
obj3.sayHello(); // "Hello, I'm Charlie"
  1. 工厂函数方式

工厂函数是一种创建对象的常见模式,但并不使用new关键字。

function createPerson(name, age) {  
    let obj = {};  
    obj.name = name;  
    obj.age = age;  
    obj.sayHello = function() {  
        console.log("Hello, I'm " + this.name);  
    };  
    return obj;  
}  
  
let obj4 = createPerson("David", 20);
  1. 使用class语法(ES6+)

ES6引入了class语法,它提供了一种更接近传统面向对象编程的语法糖。

class Person {  
    constructor(name, age) {  
        this.name = name;  
        this.age = age;  
    }  
  
    sayHello() {  
        console.log("Hello, I'm " + this.name);  
    }  
}  
  
let obj5 = new Person("Eve", 22);
  1. Object.assign() 方法

虽然Object.assign()通常用于复制或合并对象,但它也可以用于创建新对象。

javascript复制代码
​
let obj6 = Object.assign({}, {name: "Frank", age: 23});

注意:这种方法只是浅拷贝,如果源对象的属性值也是对象,那么目标对象将获得那个对象的引用,而不是它的一个拷贝。

当然,还有一些不太常见但是有用的对象创建方式:

  1. 组合使用构造函数模式和原型模式:这种方式结合了构造函数模式和原型模式的优点。使用构造函数模式定义对象的实例属性,而使用原型模式定义共享的方法和属性。
function Person(name, age) {
    this.name = name;
    this.age = age;
}
​
Person.prototype.greet = function() {
    console.log('Hello!');
};
​
var person = new Person('John', 30);
  1. 动态原型模式:在需要的时候初始化原型对象,以保持代码更加清晰。这种方式避免了在构造函数中定义方法,同时利用了原型的性能优势。
function Person(name, age) {
    this.name = name;
    this.age = age;
​
    if (typeof this.greet !== 'function') {
        Person.prototype.greet = function() {
            console.log('Hello!');
        };
    }
}
​
var person = new Person('John', 30);
  1. 寄生构造函数模式:创建一个函数,该函数内部以某种方式增强或扩展对象,然后返回这个对象。
function Person(name, age) {
    var person = {}; // 创建一个新对象
​
    person.name = name;
    person.age = age;
    person.greet = function() {
        console.log('Hello!');
    };
​
    return person; // 返回这个对象
}
​
var person = new Person('John', 30);

这些方式虽然不太常见,但在特定的情况下可以提供更灵活、清晰或者高效的对象创建方式。