Dop*_*miN 9 javascript inheritance class 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.
Run Code Online (Sandbox Code Playgroud)
我知道可以创建对象,例如TestFromObject,而无需先使用关键字创建类class。有class必要吗?这两种对象有区别吗?如果是这样,它必须class显式使用什么效果?
usingnew创建一个新对象,其内部原型是该类的原型。例如:
class Test {
say() {
console.log("I'm a test.");
}
}
let TestFromClass = new Test();
console.log(Object.getPrototypeOf(TestFromClass) === Test.prototype);Run Code Online (Sandbox Code Playgroud)
这对于创建多个对象很有用。这样做的通常原因是每个对象都可以有某种关联的状态- 通常是其属性的值。例如,一个Person对象可能有一个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());Run Code Online (Sandbox Code Playgroud)