首页 > 解决方案 > JavaScript中的对象和类中的对象有什么区别?

问题描述

我在工作和学校学习 JavaScript 和 Java。据我所知,在 Java 中,您总是有一个类,并且您可以从该类创建对象。同样适用于 JavaScript,但是:在 JavaScript 中,可以创建没有类的对象。

所以我的问题是:JavaScript 中这两种对象有什么区别?

class Test {
    say() {
        console.log("I'm a test.");
    }
}

let TestFromClass = new Test();

let TestFromObject = {
    say() {
        console.log("I'm also a test.");
    }
};


TestFromClass.say();    // Output: I'm a test.
TestFromObject.say();   // Output: I'm also a test.

现在我想知道它们是否有区别,或者我们是否真的需要 JavaScript 中的类。

标签: javascriptclassinheritancejavascript-objects

解决方案


使用 时new,您构造了一个新对象,其内部原型是类的原型。例如:

class Test {
    say() {
        console.log("I'm a test.");
    }
}

let TestFromClass = new Test();
console.log(Object.getPrototypeOf(TestFromClass) === Test.prototype);

当您需要创建多个对象时,这很有用。通常,创建此类对象是因为它们将具有与每个单独对象相关联的某种状态,通常以对象属性的形式(例如,一个人对象可能具有一个name和一个age属性)。

但是,如果您没有与实例关联的任何数据(在您的示例中为TestFromClass对象),那么拥有一个实例根本没有多大意义。

如果您只想将命名函数收集到数据结构中,那么您TestFromObject比类更有意义。

也就是说,您可能希望拥有一个类,该类具有与其相关联的一些函数(例如say),这些函数与其数据的实例没有任何关系,同时仍然能够创建一个实例,也许与原型。这并不少见,是通过制作与实例无关的函数来完成的static

class Person {
  static canEat() {
    return ['apples', 'bananas', 'carrots'];
  }
  constructor(name, age) {
    this.name = name;
    this.age = age;
  }
}
const p = new Person('Bob', 99);
console.log(p.name);
console.log(Person.canEat());


推荐阅读