Ответ 1
Обновление: метод toMethod
был только экспериментальным и не попал в стандарт. Домашний объект по существу статичен, единственный способ манипулировать super
заключается в изменении [[prototype]]:
var base = {…}; // as below
var obj = Object.setPrototypeOf({
foo() { // needs to use method definition syntax
super.foo();
}
}, base);
obj.foo();
Он очень похож на метод bind
объектов функции. Однако вместо создания новой функции с привязанным значением this
она создает новую функцию с привязкой [[HomeObject]]
, которая ссылка, которая используется для вызовов super
:
[[HomeObject]]
(Object): Если функция используетsuper
, это объект, чей[[GetPrototypeOf]]
предоставляет объект, в котором начинается поиск свойств супер.
Рассмотрим этот пример (не используя какой-либо синтаксис класса):
var base = {
foo: function() {
console.log("base foo called on", this);
}
};
base.foo(); // base foo called on base
var obj = Object.create(base);
obj.foo(); // base foo called on obj
obj.foo = function() {
super.foo();
};
obj.foo(); // ReferenceError: this method has no home
obj.bar = obj.foo.toMethod(obj);
obj.bar(); // base foo called on obj
obj.baz = function() {
super();
};
obj.baz(); // ReferenceError: this constructor has no parent class
Reflect.setPrototypeOf(obj.baz, base.foo);
obj.baz(); // base foo called on obj