21

ES6 が最終的に Array のサブクラス化を許可するようになったと聞きました。によって与えられた例を次に示します。

class Stack extends Array {
    constructor() { super() }
    top() { return this[this.length - 1]; }
  }

  var s = new Stack();
  s.push("world");
  s.push("hello");
  console.log(s.top());  // "hello"
  console.log(s.length); // 2

確かに、それはうまくいきます。しかし、少なくとも Traceur では、長さを明示的に設定しても配列は切り捨てられません。また、console.log を介して出力すると、出力は配列形式ではなくオブジェクト形式になります。これは、誰かがそれを「実際の」配列と見なしていないことを示唆しています。

これは、Traceur が組み込みオブジェクトのサブクラス化を実装する方法の問題ですか、それとも ES6 の制限ですか?

4

2 に答える 2

1

問題は、コンストラクターをオーバーライドしていることです。を削除するconstructor () { super(); }と、配列を切り捨てる s.length = 0 を含め、例は完全に機能します。

于 2015-12-08T16:59:01.993 に答える