javascript - 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 中的类。
解决方案
使用 时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());
推荐阅读
- c++ - 如何使用递归在 .txt 中编写多行?
- javascript - 如何在反应循环中设置动态复选框的状态?
- java - 无法在 Java 中找到确切日期匹配的 Mongodb 文档
- c - 计算总数 文件中的关键字
- c++ - 如何使用 asn1c 生成的代码解码 MAP Invoke 消息
- javascript - 如何使用 Firebase 云功能向多个设备令牌发送通知
- flutter - 任务 ':app:compileDebugJavaWithJavac' 执行失败。扑
- python - PyInstaller Django 编译
- angular - Angular Observable 不返回任何数据
- python - 如何使用python找到矩阵的特征空间