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

该向量是具有 3 个元素的 float32array。我不知道为什么它不起作用。如果我运行此代码,我会收到错误消息:'vec3.length' is not a function

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

编辑:我替换lengthgetLength. 现在它可以在除 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);
};

截至您的编辑:

我替换lengthgetLength. 现在它可以在除 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 回答