Комментарии 6
По поводу последнего(сохранение привязки), откуда оригинальный автор это взял? В стандарте я чего-то этого не нашел, и если бы это было, то это потеря обратной совместимости. В том же Babel принудительно методы из инстанса отвязывают от контекста с помощью (0, improtedObject.method)(...args). Всегда контекст теряется, не важно, из класса или из объекта.
P.S. Да, там Undefined с большой.
var obj = {
toString() {
return "MyObject: " + super.toString();
}
}
console.log(obj.toString()); // MyObject: [object Object]
var a = obj.toString;
console.log(a()); // MyObject: [object Undefined]
P.S. Да, там Undefined с большой.
0
Только что в хроме попробовал,
MyObject: [object Object]
и MyObject: [object global]
соответственно. А в FF super не работает :(0
Оба результата верны, разгадка в strict mode.
0
Не совсем, this — теряется 100%(и с 'use strict' и без), сам прототип нет, вот пример:
То-есть оно оставляет привязанным прототип, но никак не this.
Если бы он оставлял одинаковый this — это было бы ошибкой, так как теряется совместимость со старыми версиями. (Если нужно оставить this — юзайте bind)
В стандарте я такой вещи не видел, хотя просматривал много ее (особенно когда еще стандарт был в драфте)
class Some {
toString() {
return "MyObject: " + super.toString()
}
}
class Another extends Some {
toString() {
return "Another: " + super.toString()
}
}
var obj1 = new Another();
console.log(obj.toString()); // Another: MyObject: [object Object]
var a = obj1.toString;
console.log(a()); // Another: MyObject: [object Undefined]
То-есть оно оставляет привязанным прототип, но никак не this.
Если бы он оставлял одинаковый this — это было бы ошибкой, так как теряется совместимость со старыми версиями. (Если нужно оставить this — юзайте bind)
В стандарте я такой вещи не видел, хотя просматривал много ее (особенно когда еще стандарт был в драфте)
0
Домашний объект биндится при создании метода,
super
получается как его прототип на рантайме, а контекстом получения свойства (возможный вызов геттеров) и исполнения метода становится текущий this
. То есть для super.toString();
в данном случае полноценным дешугарингом является:Reflect.apply(Reflect.get(Reflect.getPrototypeOf(obj), 'toString', this), this, []);
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Тонкости ES6: Наследование (часть 1)