javascript - Javascript 中是否需要类?它们对创建对象有什么影响?

标签 javascript class inheritance javascript-objects

考虑这个示例代码:

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.

我知道可以创建对象,例如 TestFromObject,而无需首先使用 class 关键字创建类。 class 有必要吗?这两种对象之间有区别吗?如果是这样,显式使用 class 有什么影响?

最佳答案

使用 new 创建一个新对象,其内部原型(prototype)是类的原型(prototype)。例如:

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

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

这对于创建多个对象很有用。这样做的通常原因是每个对象都可以具有某种关联的状态 - 通常是其属性的值。例如,一个 Person 对象可能有一个 name 和一个 age 属性。

但是,如果没有数据与实例相关联(如原始代码中的 TestFromClass),那么拥有实例就没有多大意义了。如果目的只是将命名函数收集到数据结构中,则 TestFromObject 方法更有意义。

就是说,有时希望有一个类具有与其相关联的一些函数(如 say),而这些函数与其数据实例没有任何关系,而仍然 能够创建一个实例——也许在原型(prototype)上使用其他方法。这并不少见,它是通过将非实例相关的函数设为 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());

关于javascript - Javascript 中是否需要类?它们对创建对象有什么影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58300615/

相关文章:

c++ - 继承嵌套模板类的特化

javascript - 联系表格和 PHP

javascript - array.push() 方法抛出 TypeError

ios - Swift 2.1 无法识别我的类(class)

php - 类、实例和对象的问题

java - 在不使用库的情况下从数组列表中删除元素。 java

c++ - 没有 "using"的模板基类的访问属性

c++ - unique_ptr 的 vector ,继承?

javascript - 有关此代码中 "undefined"用法的澄清吗?

javascript - 关于node.js返回数据到ajax调用函数