3

vector初期化がゼロの配列であるJavaScriptクラスを作りたい。後で数学機能を追加したいと思うかもしれませんが、プログラムは大量のデータを処理するため、ネイティブタイプのメモリやパフォーマンスの品質を犠牲にしたくありません。(基本的には科学的な視覚化です。)

Array.prototypeプロトタイプチェーンに挿入するために、私は使用しようとしました

vector.prototype = Object.create( Array.prototype );

Firefoxでエラーが発生する

TypeError:互換性のないオブジェクトでArray.prototype.toSourceが呼び出されました

これはFirefoxのバグですか?Webkitで動作するようです。

それで、私はFloat32Array私が望むものに近いものを使用しようとしました、そしてとにかくデフォルトでゼロ初期化されました。

var vector = function( size ) { Float32Array.call( this, size ); }
vector.prototype = Object.create( Float32Array.prototype );

Firefoxでは、これは実行されますが、newオブジェクトを適切に初期化しません。Webkitnew vectorでは例外をスローします。代わりに使用しても違いはありませんvector.prototype = Float32Array.prototype

私は基本的にあまりにも多くを求めていますか?

4

1 に答える 1

3

JavaScript 配列から真に継承することは、言語に組み込まれている非常に特殊な機能と配列の処理方法のため、ほぼ不可能です。たくさんの答えが表示されますが、それらのほとんどは特別な状況では失敗します。1) 継承すると、特別な長さのプロパティが失われます。2) __ ProtoType __ 変数を使用する場合、それは非標準であり、すべてのブラウザーで機能するとは限りません。3) チェック時に失敗する可能性のあるサードパーティ ライブラリのアレイを検出する方法は多数あります。instanceof Array.isArray と ==['Object Array'] はすべて使用できます。

詳細については、この記事をお勧めします。 ECMA はまだ配列をサブクラス化できない

実際の配列を返し、これらの問題をすべて回避する解決策があります。JavaScript 配列からのフィドルInhetitは、フィドルの 検出、長さ、および機能のテストがあります。

var ArrayGenerator = (function () {
    var args = [].slice.call(arguments);
    var Arr = new Array();
    var ovevar ArrayGenerator = (function () {
    var args = [].slice.call(arguments);
    var Arr = new Array();
    var overiddenPush = Arr.push;
    args.forEach(function (arg) {
        Arr.push(arg);
    });
    args = null;
    Arr.push = function (args) {
        overiddenPush.apply(this, arguments);
    }
    Arr.TableName = "YourTable";
    return Arr;
});

//次のように配列を初期化します

    var MyArray=new ArrayGenerator(1,2,3);
  1. 実数配列を返します
  2. 検出の問題なし
  3. 必要なものをすべてオーバーライドし、継承された配列のようにカスタム プロパティとメソッドを追加できます。

配列を作成し、元のメソッドを内部変数に格納し、パブリック メソッドを独自のものに置き換えるだけです。ベースを呼び出すには、通常の継承されたオブジェクトのようなプロトタイプではなく、参照されたメソッドを呼び出すだけです。

于 2015-05-23T03:04:24.083 に答える