Pull to refresh

Comments 6

По поводу последнего(сохранение привязки), откуда оригинальный автор это взял? В стандарте я чего-то этого не нашел, и если бы это было, то это потеря обратной совместимости. В том же Babel принудительно методы из инстанса отвязывают от контекста с помощью (0, improtedObject.method)(...args). Всегда контекст теряется, не важно, из класса или из объекта.

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 с большой.
Только что в хроме попробовал, MyObject: [object Object] и MyObject: [object global] соответственно. А в FF super не работает :(
Оба результата верны, разгадка в strict mode.
Не совсем, this — теряется 100%(и с 'use strict' и без), сам прототип нет, вот пример:
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)

В стандарте я такой вещи не видел, хотя просматривал много ее (особенно когда еще стандарт был в драфте)
Я что-то говорил про привязанный this? :) Смотрите комментарий ниже. Babel эмулирует окружение модулей, у него строгий режим исполнения по умолчанию. Топикостартер же запустил код без 'use strict'.
Домашний объект биндится при создании метода, super получается как его прототип на рантайме, а контекстом получения свойства (возможный вызов геттеров) и исполнения метода становится текущий this. То есть для super.toString(); в данном случае полноценным дешугарингом является:

Reflect.apply(Reflect.get(Reflect.getPrototypeOf(obj), 'toString', this), this, []);
Sign up to leave a comment.

Articles