

javascript初心者です  
javascriptのArrayクラスを継承して新たに自作クラスを作成したいと思いました。以前にJavaでArrayListを継承し作ってあったのでjsweetでの自動変換を参考に以下のようなコードを書きました。リスト内にネストがあったらそのネストをなくすようなメソッドunnestを作成しました。

[code]

    var SuperArray=(function(){
        function SuperArray(c) {
            if (((c != null && (c instanceof Array)) || c === null)) {
                var __args = Array.prototype.slice.call(arguments);
            }
            else if (c === undefined) {
                var __args = Array.prototype.slice.call(arguments);
            }
            else
                throw new Error('invalid overload');
        }
        SuperArray.prototype = Object.create(SuperArray.prototype, {value: {constructor: SuperArray}});
        SuperArray.prototype.unnest = function () {
            var list = ((function () { var __o = new SuperArray(); __o.__delegate = []; return __o; })());
            for (var i = 0; i < this.__delegate.length; i++) {
                var o = this.__delegate[i];
                if (o != null && o instanceof SuperArray) {
                    /* addAll */ (function (l1, l2) { return l1.push.apply(l1, l2); })(list.__delegate, o.unnest());
                }
                else {
                    /* add */ (list.__delegate.push(o) > 0);
                }
            }
            ;
            return list;
        };
        return SuperArray;
    }());
    
[/code]

SuperArrayクラスのオブジェクトを作成し.unnestとすると _Uncaught TypeError: Cannot read property
'length' of undefined_
というエラーをChromeが吐きました。SuperArrayはArrayを継承しているのだからlengthパラメータも使えるのではないかと思ったのですが…  
ちなみにSuperArrayオブジェクトlistにlist.lengthしても大丈夫ですが、list.unnest().lengthしたら上記のエラーを吐きます。  
一応継承とかprototypeとか勉強したのですがよくわかってない部分が多いです。いろいろと自分が勘違いしている点が多そうですが教えていただけると非常に助かります。宜しくお願いします。

* * *

以下追記

8/14 15:50  
_delegateやコンストラクタはjsweetそのままの表記です。別に丸投げしたいわけではないのですが、調べてもわからないことだらけなので参考になるサイトなどを教えていただけるだけでも助かります。


CC BY-SA 3.0
2017-08-14T06:45:20.327
37182
2018-11-06T02:00:02.010
2017-08-14T08:45:57.233
19110
24870
question
javascript
javascriptでのクラスの継承について


SuperArray は Array を継承できていません

[code]

    - SuperArray.prototype = Object.create(SuperArray.prototype, {value: {constructor: SuperArray}});
    + SuperArray.prototype = Object.create(Array.prototype, {value: {constructor: SuperArray}});
    
[/code]

でうまくいくように思います

Array や RegExp といった、複雑な機能を持った Built-in object
を継承する場合、`Object.create`を使って継承するよりも`extends`キーワードを使って継承するのが望ましいです

[code]

    class SuperArray extends Array {}
    var superArray1 = new SuperArray(1,2,3);
    console.info(...superArray1); // 1, 2, 3
    superArray1.length = 0;
    console.info(...superArray1); // undefined
    
[/code]

lengthプロパティを操作したときにindexプロパティが操作される Array の特徴も継承されます

ES6 以降を利用できない環境なのであれば、babel で ES5 に変換するのがよいと思います  
オンラインの repl もあるので、試してみてはいかがでしょうか

<http://babeljs.io/repl/>


CC BY-SA 3.0
2017-08-15T00:30:22.177
37198
2017-08-15T00:30:22.177
9796
37182
answer