Как стать автором
Обновить

Комментарии 8

А где Typescript?


class BasicClass {
    static staticMethod() {}
    constructor(x) {
        this.x = x;
    }

    someMethod() {}
}

class DerivedClass extends BasicClass {
    static staticMethod() {}
    constructor(x) {
        super(x);
    }
    someMethod() {
        super.someMethod();
    }
}

var __extends = (this && this.__extends) || (function () {
    var extendStatics = Object.setPrototypeOf ||
        ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
        function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
    return function (d, b) {
        extendStatics(d, b);
        function __() { this.constructor = d; }
        d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
    };
})();
var BasicClass = /** @class */ (function () {
    function BasicClass(x) {
        this.x = x;
    }
    BasicClass.staticMethod = function () { };
    BasicClass.prototype.someMethod = function () { };
    return BasicClass;
}());
var DerivedClass = /** @class */ (function (_super) {
    __extends(DerivedClass, _super);
    function DerivedClass(x) {
        return _super.call(this, x) || this;
    }
    DerivedClass.staticMethod = function () { };
    DerivedClass.prototype.someMethod = function () {
        _super.prototype.someMethod.call(this);
    };
    return DerivedClass;
}(BasicClass));
Он в варианте «Другую». Собственно, я за него и голосовал.
TypeScript, пожалуй, достоин того, чтобы быть как минимум вне категории «другое». В идеале — самостоятельная категория.
А в чём принципиальное отличие этой реализации от Babel?
Наследование статических полей — точно так же, методом Object.setPrototypeOf.
Наследование динамических полей — точно так же, методом d.prototype = Object.create(b).
Ссылка на супер-класс так же подменяется во время компиляции.
Смысл тот же, просто чуть больше проверок на редкие крайние случаи.

Typescript, как и Babel своих особых классов не имеет, просто эмулирует ES6. Поэтому поведение и функциональность отличаться не должны.


Смысла голосовать отдельно за Typescript или Babel нет. Лучше бы в голосовании было бы просто "за ES6-классы (с любой эмуляцией)"

Всего не охватишь, есть ещё Mootools и т.п. Но спасибо за пример кода!
Выглядит аналогично реализации Babel.
Классическое наследование в JavaScript

После этой фразы я приготовился зачерпнуть ересь двумя руками.
Как известно, в чистом JavaScript классического наследования нет

Но уже в этом месте практически восстановил веру в человечество автора.

Что до реализации, то вариант BB не так уж и плох: он решает задачи по расширению базовых прототипов самой библиотеки. Если же нужно расширять собственные или делать многоуровневое наследование, то такой способ может не подойти. Тут то и появляется старый добрый CoffeeScript, который в связке с BB работал на ура.

instant.coffee
class MainView extends Backbone.Layout
  # pass



instant.js
var MainView,
  extend = function(child, parent) { for (var key in parent) { if (hasProp.call(parent, key)) child[key] = parent[key]; } function ctor() { this.constructor = child; } ctor.prototype = parent.prototype; child.prototype = new ctor(); child.__super__ = parent.prototype; return child; },
  hasProp = {}.hasOwnProperty;

MainView = (function(superClass) {
  extend(MainView, superClass);

  function MainView() {
    return MainView.__super__.constructor.apply(this, arguments);
  }

  return MainView;

})(Backbone.Layout);

Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.