Оба Object.getPrototypeOf () (замена на устаревшие Object.prototype.__proto__
) или Object.prototype.constructor
должны работать:
Object.getPrototypeOf(obj).constructor.f();
obj.constructor.f();
На самом деле:
Object.getPrototypeOf(obj).constructor === obj.constructor; // true
Здесь вы можете увидеть скомпилированный источник в действии:
class Base {
static f() { console.log('Base'); }
}
class A extends Base {
static f() { console.log('A'); }
}
class B extends Base {
static f() { console.log('B'); }
}
const objBase = new Base();
const objA = new A();
const objB = new B();
Object.getPrototypeOf(objBase).constructor.f();
objBase.constructor.f();
Object.getPrototypeOf(objA).constructor.f();
objA.constructor.f();
Object.getPrototypeOf(objB).constructor.f();
objB.constructor.f();
console.log(Object.getPrototypeOf(objB).constructor === objB.constructor);
console.log(Object.getPrototypeOf(objB) === B.prototype);
.as-console-wrapper {
max-height: none !important;
}
Обратите внимание, что статические свойства существуют в классах, но не в экземплярах.
Поэтому, если вы хотите перейти от obj
к его прототипу,вам следует вызывать Object.getPrototypeOf(obj)
, а не obj.prototype
, что является совершенно другой вещью.
Свойство .prototype
существует только в функциях и при создании нового объекта с использованием new
и обращении к нему. Функция конструктора (new A()
) станет прототипом вновь созданного объекта (устарела .__proto__
).
В вашем примере:
obj.prototype; // undefined
A; // class A { static f() { ... } }
A.protoype; // { constructor: class A { ... } }
A.protoype.constructor; // class A { static f() { ... } }
A.protoype.constructor === A; // true
obj.constructor; // class A { static f() { ... } }
obj.constructor === A; // true
Object.getPrototypeOf(obj) === A.prototype; // true