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));
};


向量是一个带有3个元素的float32array。我不知道为什么它不起作用。如果运行此代码,则会出现错误:'vec3.length' is not a function

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




编辑:我用length替换了getLength。现在,除了在Firefox中,它在任何地方都可以使用。

最佳答案

lengthFloat32Array属性是只读的,因此您不能将其替换为函数。在当前的规范草案中,您可以在Section 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作为原型会有多少好处。

09-27 21:57