在 JavaScript 中,如果我创建一个带有静态方法的类,然后创建该类的子类,我也可以使用子类名称调用静态方法(静态方法是继承的)。
Object 类是所有类的超类,具有许多静态方法。 https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Object 但为什么这些方法都不能使用任何子类名称来调用?
更新: 我注意到有人建议明确“extend”Object。 但 Object 类已经是 JavaScript 中每个类的超类。证明是 .toString() 方法,每个类的每个对象都有它,我们知道它是从 Object 类继承的,即使你没有显式地写“extends Object”。 因此,每个类都隐式扩展 Object(直接或通过继承链),但为什么非静态方法会自动继承,而不是静态方法?
至于示例代码:
class Test {
constructor() {}
}
const test = new Test();
console.log(test.toString()); // works, inherited from Object class
console.log(Test.<any static method of Object>)); // doesn't work
OP 问为什么应该用 Object 来扩展 Test 以使静态方法能够工作。
嗯,JS 类是 ES6 的一个特性。在此之前只有原型存在。
JS 类需要从基类显式扩展。
当你省略这个时,类的实例
是从 Object 扩展而来的 Object.prototype
所以没有静态方法。
class Test extends Object{
}
console.log(Test.values({key:'value'}));
class Test2{
test = 'test'
}
console.log(new Test2 instanceof Object);
console.log(new Test2().hasOwnProperty('test'));
console.log(Test2.values({key:'value'}));