0
var vector = function(x, y, z) {
    this[0] = x || 0;
    this[1] = y || 0;
    this[2] = z || 0;
};

vector.prototype = new Float32Array(3);

vector.prototype.getLength = function() {
    return Math.sqrt(Math.pow(this[0],2)+Math.pow(this[1],2)+Math.pow(this[2],2));
};

The vector is a float32array with 3 elements. I have no idea why it doesn't work. If I run this code, I get an error: 'vec3.length' is not a function

var vec3 = new vector(3,4,5);
alert(vec3.getLength());

Edit: I replaced length with getLength. Now it works everywhere except in firefox.

4

1 に答える 1

2

lengthプロパティFloat32Arrayreadonlyであるため、関数に置き換えることはできません。現在のドラフト仕様では、セクション 7でこれを確認できます。

interface TypedArray {
    const unsigned long BYTES_PER_ELEMENT = element size in bytes;

    readonly attribute unsigned long length; // <=== Note `readonly`

    getter type get(unsigned long index);
    setter void set(unsigned long index, type value);
    void set(TypedArray array, optional unsigned long offset);
    void set(type[] array, optional unsigned long offset);
    TypedArray subarray(long begin, optional long end);
};

あなたの編集の時点で:

と交換lengthしましたgetLength。現在、Firefox を除くすべての場所で動作します。(intermediate value).getLength is not a function

そのような質問の内容を交換するのは本当にクールではありません。しかし、Firefox はFloat32Arrayオブジェクトを拡張不可能と見なす場合があります。getLengthその場合は、別のレイヤーを追加して、中間のプロトタイプを作成できるようにする必要がある場合があります。例えば:

function protovector() {
}
protovector.prototype = new Float32Array(3); 

function vector(/* ... */) {
}
vector.prototype = new protovector();
vector.prototype.getLength = function() {
    // ...
};

または単に置くlengthgetLength、インスタンスに:

function vector(/* ... *) {
    // this[0] = ...
    this.length = function() {
        // ...
    };
}

Float32Arrayしかし、型付き配列は構築時に設定される固定長であるため、そもそもプロトタイプとして使用することでどれだけ得られるかわかりません。

于 2013-03-11T22:05:55.263 に答える