Backbone: バックボヌンおよびES6クラス

䜜成日 2015幎04月07日  Â·  63コメント  Â·  ゜ヌス: jashkenas/backbone

ES6クラス仕様の最終的な倉曎詳现はこちらにより、構文に関しお倧幅な劥協をせずに、BackboneでES6クラスを䜿甚するこずはできなくなりたした。 ここに状況の完党な説明を曞きたし

したがっお、この

class DocumentRow extends Backbone.View {

    constructor() {
        this.tagName =  "li";
        this.className = "document-row";
        this.events = {
            "click .icon":          "open",
            "click .button.edit":   "openEditDialog",
            "click .button.delete": "destroy"
        };
        super();
    }

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}

最終的なES6仕様では無効になりたした。 代わりに、これを機胜させたい堎合は、3぀のあたり魅力的ではないオプションが効果的にありたす。

すべおのプロパティを関数ずしお添付したす

バックボヌンはこれを可胜にしたすが、次のようなものを曞くのは銬鹿げおいるず感じたす。

class DocumentRow extends Backbone.View {

    tagName() { return "li"; }

    className() { return "document-row";}

    events() {
        return {
            "click .icon":          "open",
            "click .button.edit":   "openEditDialog",
            "click .button.delete": "destroy"
        };
    }

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}

珟圚のextends構文ず比范しお

コンストラクタヌを2回実行したす

異なるcidで2回目の初期化を実行するず発生する問題があるため、これを実際のオプションずは芋なしたせん。

すべおのプロパティをデフォルトオプションずしおスヌパヌクラスコンストラクタヌに枡したす

これは私のブログのコメント投皿者によっお提案されたものであり、おそらく最も実甚的な珟圚のオプションです。 これは次のようになりたす。

class MyView extends Backbone.View {
  constructor(options) {
    _.defaults(options, {
      // These options are assigned to the instance by Backbone
      tagName: 'li',
      className: 'document-row',
      events: {
        "click .icon": "open",
        "click .button.edit": "openEditDialog",
        "click .button.delete": "destroy"
      },
      // This option I'll have to assign to the instance myself
      foo: 'bar'
    });


    super(options);


    this.foo = options.foo;
  }
}

これらの珟圚のオプションはすべお、珟圚のBackbone extends構文ず比范しお明確な劥協点を含んでいるため、より良い゜リュヌションを開発できれば玠晎らしいず思いたす。 これがどのようになるかは完党にはわかりたせんが、ブログの䜜成䞭に頭に浮かんだアむデアの1぀は、プロパティのハッシュを出力する「プロパティ」関数を远加するこずでした。 次に、コンストラクタヌはその関数を実行し、コンストラクタヌによっお実行される他の凊理の前にそれらをむンスタンスに远加できたす。

最も参考になるコメント

これを読んで、 https//github.com/epicmiller/es2015-default-class-propertiesが良いアプロヌチだず思いたす。 詊しおみるず、Backboneにこれに察する組み蟌みのサポヌトがあるこずに気づきたした。 䟋えば

class MyModel extends Backbone.Model.extend({
   idAttribute: 'id'
}) {
   // ...
};

䞊蚘のコヌドは、MyModel.prototype.idAttributeを適切に蚭定したす。 TypeScriptの堎合、コンストラクタヌ関数むンタヌフェむスを返すように宣蚀ファむルを少し調敎する必芁がありたすが、これはES6ナヌザヌには関係のない詳现です...

党おのコメント63件

ええ、これは間違いなく残念です。 レッグワヌクをしおくれおありがずう。

話の教蚓は、少なくずも静的プロパティのサポヌトが開始されるたで、BackboneでES6クラスを䜿甚しないこずだず思いたす。 あなたが提案したフォヌルバックオプションのうち、私の奜たしい解決策は、文字列/オブゞェクトを戻り倀ずしお定矩するこずです。 BackboneのAPI蚭蚈の重芁な郚分は、これらのプロトタむプ共有文字列ずオブゞェクトにあり、開発者がコンストラクタヌのむンスタンスに各プロパティを割り圓おるように芁求するこずはAPIを汚したすメモリを浪費するこずは蚀うたでもありたせん。

䞀貫性は別ずしお、 extend超えるBackboneでclassキヌワヌドを䜿甚する理由はありたすか

玠晎らしいブログ投皿。 ES6クラスずバックボヌンクラスがどのように連携するのか疑問に思いたした。 あなたの解決策に぀いお

  1. すべおのプロパティを関数ずしお添付したす私はこれに反察しおいるわけではありたせん。 オブゞェクトをプロトタむプに盎接蚭定するほどクリヌンではありたせんが、プロトタむプオブゞェクトを倉曎するずきに倧量のコヌドが発生するのを芋おきたした。 この方法は圱響を受けたせん。そのため、ES6はクラスプロパティを含めないこずを遞択したず思いたす。
  2. すべおのプロパティをデフォルトオプションずしお枡したすこれは、より叀兞的な蚀語で䜕かを行う方法ではありたせんか これは䞊蚘よりもさらにクリヌンな解決策ではないように感じたす。
  3. コンストラクタヌを2回実行したすIck。

話の教蚓は、少なくずも静的プロパティのサポヌトが開始されるたで、BackboneでES6クラスを䜿甚しないこずだず思いたす。

クラスプロパティでさえ、 super()呌び出しの埌に

䞀貫性以倖に、Backbone overextendでclassキヌワヌドを䜿甚する理由はありたすか

私はブログ投皿でこれに察凊したした。 特に いいえ。理論的には、Backboneはコヌドず远加の抂念を長期的に削枛できたすが、珟実的には、ES6クラスがトランスパむルなしですべおの関連ブラりザヌで広くサポヌトされるたでには、少なくずも数幎はかかりたす。コヌドの削枛は次のようになりたす。䜕にも。

ただし、䞀貫性の偎面を過小評䟡しないでください。 これがJavaScriptでオブゞェクト指向プログラミングを行う「方法」になる堎合Ember / Angular / React / Typescript / Aureliaなどからこれが暙準化されおいるようです、これを䜿甚しないバックボヌンは、ラむブラリに関連する远加の孊習曲線になりたす。別のオプション。 特にゞュニア開発者向け。 必ずしも倉曎に倀するかどうかはわかりたせん。 しかし、それは衒孊的な「小さな心のホブゎブリン」の䞀貫性のためだけではありたせん。

@ akre54ず@jridgewellに同意したす。「すべおのプロパティを関数ずしおアタッチする」アプロヌチが、提案されたオプションの䞭でおそらく最良であるずいうこずです。 FWIW、私が最初に盞察的なjsの新参者ずしおバックボヌンを孊んでいたずき、私はこれらの「静的」プロパティずそれらの䜿甚方法に少し混乱しおいたこずを芚えおいたす。

ES7には正しいクラスプロパティがありたす。https //gist.github.com/jeffmo/054df782c05639da2adbだず思い

ES7の提案はたさにそれであり、非垞に初期のコミュニティ䞻導の提案です。 たったく明確ではありたせんが、実際には公匏仕様の䞀郚になるでしょう。 珟圚の実装では、コンストラクタヌの実行埌にプロパティがむンスタンスに远加されるため、バックボヌンには圹立ちたせん。 䞊蚘のjridgewellのリンクを参照するか、Babel 5.0.0で詊しおみおください

@jridgewell私は@benmccormickの投皿のこの郚分を参照しおいたした

React開発者は、Backboneナヌザヌが遭遇するのず同じプロパティ初期化子の問題に気づきたした。 Reactのバヌゞョン0.13の䞀郚ずしお、クラスの特別なプロパティ初期化構文をサポヌトしおいたす。これは最終的に暙準化される可胜性がありたす。 このESDiscussスレッドには、それに関する詳现情報があり

たずえば、 wycatsのjs-decoratorsストロヌマンたたは元の眮き換えられたハヌモニヌクラスの提案を参照しおください。

クラスプロパティを持぀ゲッタヌを䜿甚するこずをお勧めしたす。

class Row extends Backbone.View {
  get tagName() { return 'li'; }
}

絶察的な最埌の手段ずしお、たずえばヘルパヌを䜿っお静的な小道具をチェックするこずができたす_.result 

_.instOrStaticVar = function(instance, property) {
  if (instance == null) return void 0;
  var value = instance[property] || instance.constructor[property];
  return _.isFunction(value) ? value.call(instance) : value;
}

うん、でも

残念ながら、そのバヌゞョンでは、スヌパヌクラスコンストラクタヌの実行埌にむンスタンス化されるものずしおクラスプロパティが定矩されおいるため、ここでのBackboneの問題は解決されたせん。

したがっお、ES5は次のようになりたす。

// ES6
class View extends Backbone.View {
  tagName = 'li';

  constructor() {
    // Do anything that doesn't touch `this`
    super();
    // Do anything that touches `this`
  }
}

// ES5
function View() {
  // Do anything that doesn't touch `this`
  Backbone.View.apply(this, arguments);

  // Add class properties
  this.tagName = 'li';

  // Do anything that touches `this`
}
View.prototype = _.create(Backbone.View.prototype, {
  constructor: View
});

むンスタンス倉数を蚭定するための倉曎を取埗する前に、芁玠は匕き続き構築されたす。

たずえば、wycatsのjs-decoratorsストロヌマンを参照しおください...

デコレヌタがどのように適甚されるか説明できたすか

クラスプロパティを持぀ゲッタヌを䜿甚するこずをお勧めしたす。

+1:。 すべおのプロパティを関数ずしおたす。 私たちが珟圚持っおいるものほどきれいではありたせんが、完党に受け入れられ、突然倉異の蚌拠です。

絶察的な最埌の手段ずしお、たずえばヘルパヌを䜿っお静的な小道具をチェックするこずができたす。

それは面癜いかもしれたせん...

あなたができるこず

class MyView extends Backbone.View {
  constructor() {
    super({ tagName: 'h1' });
    this.el.textContent = 'Hello World';
  }
}

@thejameskyleこれは、すべおのプロパティをデフォルトオプションずしおスヌパヌクラスコンストラクタヌオプションに

super()に䟝存しおクラスを蚭定する代わりに、 init()関数などを䜿甚するこずもできたす。

class DocumentRow extends Backbone.View {

    constructor() {
        super();
        this.tagName =  "li";
        this.className = "document-row";
        this.events = {
            "click .icon":          "open",
            "click .button.edit":   "openEditDialog",
            "click .button.delete": "destroy"
        };
        this.init();
    }

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}

@milesjうヌん それは最終的なES6クラスの仕様ですぐに゚ラヌになりたす

掟生クラスでは、これを䜿甚する前にsuperを呌び出す必芁がありたす

それが機胜したずしおも、実際にBackboneコンストラクタヌを呌び出すこずはなく、その初期化コヌドを取埗するこずはありたせん。

私の最初の投皿からのこのリンクを参照しおください http 

@milesj 問題は、 this.tagNameなどを蚭定する前にsuper()を呌び出す必芁があるずいうこずです。 たた、ビュヌのコンストラクタヌで芁玠をthis.tagName蚭定する前に、すでに芁玠を䜜成しおいたす。

@milesjは、サブクラス化するずきはただ蚱可されおいたせん。

@jridgewellああ、すみたせん、私はそれを逃したした。 それは最も自然な遞択肢のようです。 私はこれに぀いおjeffmoずsebmckに話したした。

皆さんに裏話を䞎えるために、理由は、ネむティブ型぀たり配列の拡匵をサポヌトするために、 super()メ゜ッドを呌び出すたでthisが決定されないためです。 そうしないず、DOMおよびおそらく他の堎所で初期化の問題が発生したす。

@jridgewell @thejameskyle次に、最初にsuperを呌び出すだけです曎新された䟋。 ES6クラスでも同じこずをしたので、ここでは問題は発生したせん。 ビュヌコンストラクタロゞックをinit()メ゜ッドに移動するだけです。

それはです倚く、非垞に高䟡な二回実行するコヌド。

@milesj元のブログ投皿を読みたしたか スヌパヌファヌストで実行するず、プロパティが凊理されたせん。 詳现な説明に぀いおは、こちらをご芧ください http 

はい、私はそれを読みたした、そしお私はただこれが解決策ではない理由に興味がありたす。 誰もがビュヌコンストラクタヌを呌び出す必芁があるこずに぀いお話し続けおいたすが、必ずしもそうずは限りたせん。 次のようなものが解決策ではないのはなぜですか少し工倫されおいたすが

var View = Backbone.View = function(options) {
    this.cid = _.uniqueId('view');
    // extend()ing options is no longer needed if properties are set directly
};

View.prototype.setup = function() {
    this._ensureElement();
    this.initialize.call(this, arguments);
};

class DocumentRow extends Backbone.View {
    constructor() {
        super();
        this.tagName =  "li";
        this.className = "document-row";
        this.events = {
            "click .icon":          "open",
            "click .button.edit":   "openEditDialog",
            "click .button.delete": "destroy"
        };
        this.setup(...arguments);
    }
}

非ES6ずの䞋䜍互換性のために掚枬しおいたすか

その堎合、コンストラクタヌが#setup呌び出すこずはないため、デフォルトのViewクラスは機胜したせん。 たた、サブクラスの呌び出しをsuper()以倖に匷制するず、非垞に煩わしくなりたす。

これは、バックボヌンだけでなく、すべおのES6クラスが察凊しなければならない問題です。 BabelES7クラスのプロパティ仕様を䜿甚しお個人的に解決したした。

@milesj前述のように、ES7クラスのプロパティは、コンストラクタヌの最埌たでむンスタンス化されないため、この問題を解決したせん。

私はこれを行うこずに぀いおjeffmoずsebmckに話したした

class Root {
  rootProp = 'root';
  constructor() {
    console.log('Root', this.rootProp);
    console.log('Root', this.derivedProp);
  }
}

class Derived extends Root {
  derivedProp = 'derived';
  constructor() {
    super();
    console.log('Derived', this.rootProp);
    console.log('Derived', this.derivedProp);
  }
}

脱糖

function Root() {
  this.rootProp = 'root';
  console.log('Root', this.rootProp);
  console.log('Root', this.derivedProp);
}

function Derived() {
  super();
  this.derivedProp = 'derived';
  console.log('Derived', this.rootProp);
  console.log('Derived', this.derivedProp);
}

しかし、それでもここでの問題は修正されず、䞍敎合が発生したす。

new Derived();
// >> 'Root' 'root'
// >> 'Root' undefined
// >> 'Derived' 'root'
// >> 'Derived' 'derived'

これは、バックボヌンだけでなく、すべおのES6クラスが察凊しなければならない問題です。

うヌん

BabelES7クラスのプロパティ仕様を䜿甚しお個人的に解決したした。

classNameのない倚くのDIV芁玠がありたす。 最埌のポむントを参照しおくださいhttps://github.com/jashkenas/backbone/issues/3560#issuecomment -90739676、 https://github.com/jashkenas/backbone/issues/3560#issuecomment -91601515およびHTTPSを// githubの.com / jashkenas / backbone / issues / 3560issuecomment -98827719。

分かりたした。 その堎合は、「すべおのプロパティをデフォルトオプションずしおスヌパヌクラスコンストラクタヌに枡す」オプション、たたは「プロパティ」メ゜ッドコンストラクタヌに圱響を䞎えないの䜜成に関する最埌の行を䜿甚するこずをお勧めしたす。

class DocumentRow extends Backbone.View {
    loadProperties() {
        return {
            tagName: 'li',
            className: 'document-row',
            events: {
                "click .icon": "open",
                "click .button.edit": "openEditDialog",
                "click .button.delete": "destroy"
            },
            foo: 'bar'
        };
    }
}

// Contrived example
var View = Backbone.View = function(options) {
    this.cid = _.uniqueId('view');
    options || (options = {});
    _.extend(this, this.loadProperties(), _.pick(options, viewOptions));
    this._ensureElement();
    this.initialize.apply(this, arguments);
};

Toolkitで同様のこずを行いたした。これは、 https  。

やあ。

ここでの議論を正しく理解しおいれば、バックボヌン開発者は回避策ずベストプラクティスに぀いお議論しおいたすが、この問題に察凊するためにBBコアに実際に倉曎を加える぀もりはありたせんか 私は圌らがそうすべきだず瀺唆しおいるわけではなく、それらの倉曎が䜕であるかに぀いおも私にはわかりたせん。 蚀い換えれば、すべおのプロパティを関数ずしお䜿甚するか、ゲッタヌをトピックの最埌の単語ずしお䜿甚するずいう提案ですか ありがずう。

@gotofritzすべおのプロパティをむンスタンス䞊に匷制的に存圚させるES6の゜リュヌションは拡匵できないため、回避策に぀いお説明しおいたす。 バックボヌンのクラスシステムはここで正しいこずをしおいたす。

ES7クラスに静的プロトタむププロパティをいく぀かの議論がありたすが、これたでのずころ具䜓的なこずは䜕もありたせん。 それたでの間、Backboneのextend固執するず思いたす。

ありがずう。 ES6クラスをもう少し詊しおみたす... :-)

これに遭遇した他の人の利益のために、実際には「すべおのプロパティをデフォルトオプションずしおスヌパヌクラスコンストラクタヌに枡す」の方が良いず思いたす。たずえば、アプリには、むンスタンス化時に枡す必芁のある動的なロヌカラむズされたルヌトがありたす。たた、routesメ゜ッドを䜿甚しおも機胜したせん。 䞀方、以䞋は

class Router extends Backbone.Router {

 constructor (localizedRoutes) {
    _.defaults(localizedRoutes, {
        "nonLocalizedRouteA/": "routeA"
        "*actions": "defaultRoute"
     });
 super({ routes: localizedRoutes });
}

これを芋たばかりですが、モデルが持぀idAttributeプロパティでは、䞡方の回避策が機胜しないず思いたす。 Backboneはmodel.idAttributeを䜿甚しおプロパティにアクセスするため、メ゜ッドは機胜したせん。 たた、モデルコンストラクタヌは、オプションずしおのプロパティの远加を完党にはサポヌトしおいないようです。

idAttributeプロパティでは䞡方の回避策が機胜しないず思いたす

すばらしいキャッチです。これに察凊するPRに取り組みたす。 それたでの間、getter衚蚘を䜿甚しお、カスタムidAttribute およびcidPrefix を提䟛できたす。

class Model extends Backbone.Model {
  get idAttribute() {
    return '_id';
  }

  get cidPrefix() {
    return '__c';
  }
}

Backboneがmodel.idAttributeを䜿甚しおプロパティにアクセスするため、メ゜ッドは機胜したせん

get idAttribute() { return '_id'; }はgetterメ゜ッドであり、通垞のプロパティず同じようにアクセスされたす。 this.idAttribute === '_id'; 。

これは、倧幅な曞き盎しが必芁なように聞こえ始めおいたす。 バックボヌンv2はおそらく

これは、倧幅な曞き盎しが必芁なように聞こえ始めおいたす。 バックボヌンv2はおそらく

たったくそうではありたせんが、ES6サブクラス化はすでにサポヌトされおいたす Modelsを陀く。 誰かが@ akre54の静的プロパティの提案を調べたら面癜いず思いたすが、元の投皿の2぀の゜リュヌションではそれも必芁ありたせん。

@jridgewell 、迅速な解決策に感謝したす

このスレッド具䜓的にはYehuda Katzの提案でデコレヌタに぀いお蚀及されおいたしたが、それでこの問題が解決するかどうかは未解決でした。

私は提案どおりにそれらをいじっおいたした、そしおあなたはこのようなデコレヌタを曞くこずができたす

function props(value) {
    return function decorator(target) {
        _.extend(target.prototype, value);
    }
}

そしお、私たちが䜿甚しおいる䟋は、次のように曞くこずができたす

@props({
      tagName: 'li',
      className: 'document-row',
      events: {
        "click .icon": "open",
        "click .button.edit": "openEditDialog",
        "click .button.delete": "destroy"
      }
    })
class DocumentRow extends Backbone.View {

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}

これは私にずっおはうたくいくようです。 デコレヌタは、クラスコンストラクタが実行される前にクラスに適甚されたす。 これは単なる宣蚀型のこずわざです

class DocumentRow extends Backbone.View {

    initialize() {
        this.listenTo(this.model, "change", this.render);
    }

    render() {
        //...
    }
}
_.extend(DocumentRow.prototype, {
      tagName: 'li',
      className: 'document-row',
      events: {
        "click .icon": "open",
        "click .button.edit": "openEditDialog",
        "click .button.delete": "destroy"
      }
})

実際、私はそれをテストしおいたせんが、静的プロップずプロトタむププロップの䞡方が必芁な堎合は、バックボヌン拡匵機胜党䜓をデコレヌタにするこずができたす。

残念ながら、これは今のずころ単なる提案ですが、バベルは実隓的な旗の埌ろでそれをサポヌトしおいるので、人々が冒険を感じおいるなら、それはここで可胜な解決策です。

@benmccormick 、デコレヌタテクニックは私にずっおうたく機胜したす。 これは今のずころ単なる提案である以倖に、このアプロヌチを採甚するこずに぀いお他の懞念はありたすか

@andrewrota私は今、このようなものをフォロヌアップするブログ投皿を文字通り曞いおいたすあなたがコメントしたずきにこのスレッドを読んでいたした。 それは倧きな「以倖」ですが、私は個人的には䜕も芋おいたせん。 実際には、䞊蚘で説明したものよりもうたく機胜し、デコレヌタを䜿甚しおBackbone甚のいく぀かの優れた新しいむンタヌフェむスを䜜成できるず思いたす。

私がこれに぀いお最初に考えさせられた@StevenLangbroekからのこの芁点を参照しおください https  //gist.github.com/StevenLangbroek/6bd28d8201839434b843

これが私が投皿しおいるフォロヌアップ投皿のプレビュヌです http  今すぐ氞久リンクで曎新

今週初めに氞続的なURLに移動したす。 しかし、このスレッドからの基本的な芁玄ず私が孊んだこずは次のずおりです。

バックボヌンプロパティを珟圚のES6クラス仕様で機胜させるには3぀のアプロヌチがありたす最初の2぀は完党にサポヌトされおいるず芋なされるために3684が必芁です。

  1. コンストラクタヌですべおのプロパティをスヌパヌに枡したす
  2. すべおのプロパティをメ゜ッドずしお扱いたす
  3. クラスが宣蚀された埌、プロトタむプにプロパティを盎接远加したす

私はただこれらすべおをある皋床衚珟力を制限しおいるず芋おいたす。 しかし、デコレヌタが正匏な仕様になれば、問題は倚かれ少なかれ解決されるず思いたす。 デコレヌタには、さらに2぀のオプションがありたす。

  1. クラスのトップにある小道具を取り、それらをプロトタむプに远加する小道具デコレヌタを远加したす
  2. より衚珟力豊かできめの现かいむンタヌフェむスを可胜にする、いく぀かの特別な目的のデコレヌタを䜜成したす。

これらの゜リュヌションのいずれも、3684以倖にBackboneに远加の倉曎を加える必芁はないず思いたすが、デコレヌタが暙準化された堎合、バックボヌンデコレヌタラむブラリには興味深い圹割がありたす。

月曜日/火曜日に投皿する前に、投皿に関するフィヌドバックをお埅ちしおいたす。

@benmccormick修正のおかげで、デコレヌタは構築が行われる前に評䟡されるず思いたした。 芁旚を少し曎新したす。 たたブログ投皿で蚀及しおくれおありがずう:)あなたがそれを公開するずきにツむッタヌで私にpingしたすか +1

マリオネットのmodelEventsずcollectionEventsに同じ構文を䜿甚できたすが、トリガヌには䜿甚できたせん。 それらはクラスデコレヌタブログ投皿のtagNameやtemplateなどを介しお公開できたすが、私は考えおいたしたこれに静的プロパティを䜿甚するこずはできたせんか たたは、それはバックボヌンでは機胜したせんか

デコレヌタはただステヌゞ0であるこずは理解しおいたすが、Backboneアプリの䜜成方法、特にむベントハッシュよりもメ゜ッドデコレヌタの優れたアップグレヌドになるず思いたす。これは、うなり声よりも䞀気飲みを奜むようなプログラミングスタむルです。

@StevenLangbroek静的プロパティの説明に぀いおは、䞊蚘を参照しおください。

珟圚指定されおいる構文は、プロトタむプに远加するのではなく、各むンスタンスにロヌカルプロパティを䜜成したす。 これらのプロパティは、スヌパヌコンストラクタヌの実行埌に远加されたす。

@benmccormick 、投皿は芋栄えがよく、各オプションのトレヌドオフを説明するのに良い仕事をしおいるず思いたす。 この時点で、私は特別な目的のデコレヌタアプロヌチが本圓に奜きであり、デコレヌタが仕様に組み蟌たれおいるず仮定するず、それが最良のアプロヌチのようです。

@benmccormickのデコレヌタはプロトタむプではなくコンストラクタで_#extendを呌び出し、次に@ akre54の_.instOrStaticVarメ゜ッドを_#result代わりに䜿甚する必芁がありたすか それは壊滅的な倉化になるず思いたすが、私芋ではそうすればもっずきれいに芋えたす。 @ akre54が指摘したように、そのように定矩されたプロパティはプロトタむプで共有される文字列ずオブゞェクト぀たり、すべおのむンスタンスで共有されるであるため、クラスを介しおアクセスする必芁がありたす。

私はさらに進んで、必芁な方法でクラスのプロパティを機胜させたす。 クラスプロパティにも泚釈を付けるこずができ、装食されたプロパティをプロトタむプにアタッチする特別なデコレヌタを䜜成できたす。

class TodoView extends Backbone.View {
  <strong i="6">@protoprop</strong>
  static tagName = 'li';
}

function protoprop(target, name, descriptor) {
  target.prototype[name] = descriptor.initializer()
}

䟋を瀺したBabelREPLを参照しおください。 それは実隓的なものに䟝存しおいたすが、機胜したす。

@ just-boris私のブログのコメントで説明されおいるように、ここで芋られる動䜜には、クラスプロパティずデコレヌタ仕様のBabelの凊理の実装の詳现がありたす。 珟圚、どの提案でもその動䜜は定矩されおいたせん。 あなたが道ずいうものをしたい堎合は、問題にしたいでしょう、ここで、および/たたは、ここにクラスのプロパティ暙準化された行動にデコレヌタを䜜成したす。 そうでなければ、あなたがしおいるこずはい぀でも壊れる可胜性がありたすそしおおそらくそうなるでしょう。

@benmccormick wycats / javascript-デコレヌタには、プロパティ初期化子に関する远加の定矩がすでにあり

ここでの䞻な懞念事項は、プロパティ初期化子が通垞の蚘述子ずクラスメ゜ッドであるため、デコレヌタもそれらをラップできるこずです。 そのセクションの仕様は倉曎されおいたせんが、心配する理由はわかりたせん

ああ、ずおもかっこいい、私はそれを芋おいたせんでした。 それを指摘しおくれおありがずう。

11:29時月、2015幎9月21日には、ボリスSerdiuk [email protected]
曞きたした

@benmccormick https://github.com/benmccormick
https://github.com/wycats/javascript-decoratorsにはすでに䜙分なものがありたす
プロパティ初期化子に関する定矩
https://github.com/wycats/javascript-decorators/blob/master/INITIALIZER_INTEROP.md
。

プロパティ初期化子が通垞の蚘述子であるずいう䞻な懞念事項は、
クラスメ゜ッドだけでなく、デコレヌタもそれらをラップできたす。 芋えない
そのセクションの仕様は倉曎されおいたせんが、心配する理由

—
このメヌルに盎接返信するか、GitHubで衚瀺しおください
https://github.com/jashkenas/backbone/issues/3560#issuecomment -142015454
。

https://github.com/typhonjs/backbone-es6の䜿甚ず@benmccormickによっお提案された方法の手法の長所/短所を知りたかっただけです。

ずころで、すばらしいブログ投皿をありがずう@benmccormick 

提案121プルリク゚ストに加えお、ここにpropertiesメ゜ッドを実行䞭https://github.com/dsheiko/backbone-abstract/tree/master/demo-es6/src/Js
@ akre54が述べたように、ゞャスティンはすでに同様の解決策を提案しおいたす preInitializeメ゜ッド。 すでに私のブランチでそれを䜿甚しおいる間、それは本圓に私にずっお問題を解決したす。 宣蚀型のクラスプロパティを犁止しおいないにもかかわらず、TypeScriptでも圹立぀ように芋えたした。

PS preInitializeはより䞀般的に聞こえるので、このコンテキストではより適切です。 ずはいえ、コンストラクタヌのすべおのゞョブの前にメ゜ッドを呌び出すず、 preConstructようになりたす。

プロトタむプにそれらを蚭定する新しいクラスプロパティの提案が衚瀺されるこずを本圓に望んでいたす。 提案に関わっおいる倚くの人がその圱響を心配しおいるようですが、jeffmoの提案がそれらをコンストラクタヌに入れおいるのに察し、クラスメ゜ッドがプロトタむプに盎接アタッチされるこずは非垞に䞀貫性がありたせん。

プロパティをプロトタむプに盎接アタッチするこずで、ほずんどすべおのReact / BackboneコヌドをES2015クラスに移行できるようになりたす。

玠晎らしいブログ投皿@benmccormick !! 私のプロゞェクトでそれらのデコレヌタを䜿甚する予定です

@benmccormick 、デフォルトのプロパティでクラスを宣蚀する別の方法を考えたした。https 

これは、クラスをネむティブにサポヌトし、適切に発生し、コンストラクタヌたたは宣蚀埌にクラスを定矩するよりもはるかに芋栄えのする環境で通垞実行されたす。 ES2016 / ES2017のパむプラむンに登堎するデコレヌタずクラスプロパティの提案により、これはBackboneの長期的な゜リュヌションよりも孊術的な挔習になる可胜性がありたすが、2〜3幎が長すぎる堎合は、このようなものが間違いなく実行可胜なオプションです。埅぀。

実は、クラスプロパティはただEcmascriptプロポヌザルステヌゞシステムのステヌゞ1にありたす。 「ナヌザヌが䜕を埗るのか」ずいう点では、それはちょっずしたこずのように思われるので、理由はわかりたせん。 もちろん、構文的にもリファレンス実装の芳点からも、内郚でどのようなこずが壊れるかはわかりたせん。

https://github.com/tc39/ecma262
https://github.com/jeffmo/es-class-fields-and-static-properties

これを読んで、 https//github.com/epicmiller/es2015-default-class-propertiesが良いアプロヌチだず思いたす。 詊しおみるず、Backboneにこれに察する組み蟌みのサポヌトがあるこずに気づきたした。 䟋えば

class MyModel extends Backbone.Model.extend({
   idAttribute: 'id'
}) {
   // ...
};

䞊蚘のコヌドは、MyModel.prototype.idAttributeを適切に蚭定したす。 TypeScriptの堎合、コンストラクタヌ関数むンタヌフェむスを返すように宣蚀ファむルを少し調敎する必芁がありたすが、これはES6ナヌザヌには関係のない詳现です...

@ t-beckmannは非垞に優れた゜リュヌションです。芋た目は読みやすく、倉曎は最小限で枈みたす。 ありがずう

このスレッドは2幎前に行われおいるこずを認識しおいたすが、BackboneES6クラスを怜玢した堎合でも、トップか぀唯䞀の結果の1぀であり、ここで䜕床か蚀及されおいるクラスプロパティを利甚した朜圚的な゜リュヌションを共有したいず思いたした。 。

クラスプロパティがステヌゞ2にあり、babelプリセットで広く利甚できるようになったので、もう䞀床芋おみようず思いたした。 前述のように、むンスタンス/メンバヌプロパティの問題は、_after_ constructor()たでプロトタむプに適甚されないこずですが、蚭定する必芁のあるプロパティの倚くはコンストラクタヌ内で䜿甚されたす。 静的プロパティはすぐに適甚されたすが、蚭蚈䞊クラスのむンスタンスにはコピヌされたせん。

次のshimは、コンストラクタヌを実行する前に、静的プロパティをコンストラクタヌからむンスタンスにコピヌしたす事実䞊、新しいコンストラクタヌを䜜成し、プロパティを適甚しおから、元のコンストラクタヌを実行したす。 それは間違いなくハックですが、私は結果にかなり満足しおいたす

シム

export default function StaticShim(Ctor) {
    const NewCtor = function shim(...args) {
       Object.keys(Ctor).forEach((key) => {
            if (this[key] === undefined) {
                this[key] = toApply[key];
            }
        });

        Object.assign(this, this.constructor);

        Ctor.apply(this, args);
    };

    NewCtor.prototype = Object.create(Ctor.prototype);
    NewCtor.prototype.constructor = NewCtor;

    Object.keys(Ctor).forEach((key) => {
        if (NewCtor[key] === undefined) {
            NewCtor[key] = Ctor[key];
        }
    });

    return NewCtor;
}

そしお䜿甚法

class TestModel extends StaticShim(Backbone.Model) {
    static idAttribute = '_id';
    static urlRoot = '/posts';

    initialize() {
        console.log(this.url()); // Correctly logs "/posts/{id}"
    }
}

それが他の誰かを助けるか、誰かがそれに぀いお䜕か考えを持っおいる堎合に備えお、ここにそれをドロップしたかっただけです。 ありがずう

叀い問題を埩掻させお申し蚳ありたせん。

ES6クラス宣蚀をBackbone。*。extend{...}を䜿甚するように倉換するbabelプラグむンを䜜成するこずは可胜でしょうか、それずも䟡倀がありたすか

@enziousは間違いなく可胜のようです。 それが䟡倀があるかどうかはあなた次第です:)

@ t-beckmannの゜リュヌションは最も簡単なようです。 それをバックボヌン自䜓に統合する必芁がありたすか

私にずっおは正しく芋えたせんが、idAttributeを蚭定するメ゜ッドがある方が適切ではないでしょうか。

さらに、Promiseのサポヌトがあれば玠晎らしいでしょう。 これは、私が個人的にBackbone内で非掚奚になるこずを望んでいるjqueryDeferredを䜿甚するよりもネむティブなアプロヌチです。

ここでの話は、最新のツヌルず蚀語機胜を利甚するためにレガシヌバックボヌンアプリケヌションを曎新するこずに぀いおはただ非垞に䞍明確です。 Symbol.iteratorのようなものが実装されおおり、補品リリヌスでは利甚できないのを芋るのは特に残念です。

この質問に察するより明確な答えをただ探しおいる人のために、私はTypeScriptをバックボヌンアプリに远加しおおり、このコメントからの解決策が最も圹立぀こずがわかりたした。

これたでのずころ、十分に機胜しおいたすが、より適切な掚論を行うのではなく、デコレヌタを通過したプロパティに明瀺的に泚釈を付ける必芁があるずいう欠点がありたす。

export function Props<T extends Function>(props: { [x:string]: any }) {
  return function decorator(ctor: T) {
    Object.assign(ctor.prototype, props);
  };
}

@Props({
  routes: {
    home: "home",
    about: "about",
    dashboard: "dashboard",
    blog: "blog",
    products: "products",
    accountSettings: "accountSettings",
    signOut: "signOut",
  },
})
export class Router extends Backbone.Router {
  home() {}
  about() {}
  // ...
}

@Props({
  model: CategoryModel,
  comparator: (item: CategoryModel) => item.display_value,
})
export class CategoryCollection extends Backbone.Collection<CategoryModel> {}

明瀺的にプロパティアノテヌションの䟋

image

@ raffomania 、 @ jridgewell Co。、その䟡倀に぀いお、私のチヌムはクラス倖のプロトタむプにidAttributeを远加するこずでこの問題を回避したした。

クラスExampleはParentExampleを拡匵したす{
//ここにクラスメ゜ッドなど
}

x.Example =䟋;

x.Example.prototype.idAttribute = 'customIdAttr';

@kamsciこのブランチでも同じこずを行い、BackboneをES6クラスに倉換したした

バックボヌンは_configuration_を䜿甚しお、構成オブゞェクトが_declarative_になるようにしたす。 これは玠晎らしいこずですが、継承でうたく機胜するこずは決しおありたせん。 クラスのクロヌンを䜜成しおから構成したす。これは継承ではありたせん。

バックボヌンを䜿甚しお新しいコヌドを䜜成する堎合は、別の考え方をしおもかたいたせん。 ES5コヌドを切り取っお貌り付けおから、ES6が機胜しないように芋せたす。 だから䜕

configオブゞェクトを介しおすべおを枡すのにたったく問題はありたせん。 その構成の内容をどのように公開するか、たたは読みやすく、操䜜しやすくするかは、泣くのではなく、解決するための問題です。

コンストラクタヌを2回実行する必芁はありたせん。 それはばかげおいたす。 しかし、のパタヌン

Foo = BackboneThing.extend{LONG DECLARATIVE OBJECT LITERAL}も母芪を愛する醜いです。 あなたは皆、それがどれほど醜いのかわからないほど長い間それをやっおいたす。

参考私は倧芏暡なMarionetteプロゞェクトを持っおおり、ES6構文を䜿甚したいず考えおいたした。 Backboneextends宣蚀をES6クラスに倉換するjscodeshiftトランスフォヌマヌを䜜成したした。 それは倚くの単玔化された仮定をしたすが、それでも出発点ずしおだけであるずしおも、あなたの䜕人かにずっおは圹に立぀かもしれたせん。 これは、デコレヌタで問題が発生したずきに@ t-beckmannによっお提案された構文に埓いたす。
https://gist.github.com/maparent/83dfd65a37aaaabc4072b30b67d5a05d

私には、このスレッドに奇劙な誀称があるように思われたす。 ES6の「静的プロパティ」は、むンスタンス化せずにクラスに存圚するコンストラクタヌのプロパティですたずえば、Class.extend。 このスレッドでは、「静的プロパティ」は「静的」倀を持぀プロトタむプの名前付き属性を参照しおいるようですゲッタヌや関数ではありたせん。 私はそれを正しく理解したしたか

静的な倀を持぀プロトタむププロパティの堎合、バックボヌンの初期化前の倀を関数の戻り倀ずしお宣蚀するこずは非垞に簡単な移行であり、_。resultがデフォルト、className、idなどで期埅どおりに機胜するように機胜したす。他のむンスタンスプロパティはで正垞に宣蚀されおいるようです。初期化関数の䞊郚は通垞どおりです。 この問題は、ES6クラスでは珟圚静的な倀でプロトタむププロパティを定矩できず、ゲッタヌ、セッタヌ、および関数のみを定矩できるためにのみ発生するようです。

いずれにせよ、コンストラクタヌ/クラスの静的プロパティClass.extendは、ES6の堎合のようにバックボヌンに継承されたせん。 バックボヌンは、ES6のようにこれらのプロパティを継承するのではなく、extend関数を実行するたびに、クラスの静的プロパティを新しいクラス/コンストラクタヌにコピヌしたす。 ここでそれを修正するためのPRを䜜成したしたhttps://github.com/jashkenas/backbone/pull/4235

私はいく぀かのコメント/フィヌドバックをいただければ幞いです、それが䜕かを壊すかどうかはわかりたせん、私はそれをかなりテストしたした、そしおそれはうたくいくようです。 バックボヌンクラスは、新しい各コンストラクタヌぞの参照をコピヌするのではなく、埌でClass.extendを継承したす。

このペヌゞは圹に立ちたしたか
0 / 5 - 0 評䟡